如何处理多行搜索

问题描述 投票:-1回答:1

我有一个文本文件,结构如下:

Name1 (Middlename1) LastName
Birthyear
Name2 (Middlename2) LastName
Birthyear
...
NameN (MiddlenameM) LastName
Birthyear

我正在尝试使用RE自动查找名称和年份,但是我不知道如何合并这两个RE,因为这两个信息不在同一行:

import re
regexp = re.compile(  r'(( )*)(?P<name>([a-zA-Z]*)( [a-zA-Z]+)? ROCHE)\n'
                      r'(( )*)(?P<year>18\d\d)\n'
                   )

两个RE正在独立工作,但不能一起工作。我应该怎么做?

python regex text multiline multilinestring
1个回答
0
投票
至少在英语国家中,名称可以包含连字符(Anne-Marie),撇号(O'Donnell),句号(John Q. Public)等。因此,我正在使用允许这些字符的正则表达式。同样,人们可能有多个中间名。我想说明的是如何通过名称/年份对进行迭代。您可以自定义实际的正则表达式以满足您自己的特定要求。

正则表达式:

^(?P<name>(?:[a-z.'-]+(?:\s+[a-z.'-]+)*))\n(?P<year>\d{4})\n Flags: re.M|re.I

    ^匹配行的开始。
  1. [a-z.'-]+匹配一个或多个字母,句点,'或-字符。这是一个
  2. 名称元素。
  3. (?:\s+[a-z.'-]+)*匹配一个或多个空格字符,后跟
  4. name element
  5. 。重复0次或更多次。因此,命名组name由1个或多个name elements组成,并由一个或多个空格字符分隔。[\n匹配换行符。
  6. (?P<year>\d{4})\n匹配4位数字,后跟换行符。
  • 该代码依赖于re.finditer查找连续的匹配项:

    import re text = """John Doe 1921 John Q. Public 1987 Anne-Marie Smith 1989 Paul O'Donnell 2001 J. P. Marquand 1893""" regexp = re.compile(r"^(?P<name>(?:[a-z.'-]+(?:\s+[a-z.'-]+)*))\n(?P<year>\d{4})\n", flags=re.M|re.I) for m in regexp.finditer(text): name = m['name'] year = m['year'] # do something with name and year in the second file. Here we are just printing the values. print(name, year)

    打印:

    John Doe 1921 John Q. Public 1987 Anne-Marie Smith 1989 Paul O'Donnell 2001

  • © www.soinside.com 2019 - 2024. All rights reserved.