繁体   English   中英

Python 正则表达式匹配多行字符串

[英]Python regex matching multiline string

我的字符串:

PCT Filing Date: 2 December 2015
\nApplicants: Silixa Ltd.
\nChevron U.S.A. Inc. (Incorporated
in USA - California)
\nInventors: Farhadiroushan,
Mahmoud
\nGillies, Arran
Parker, Tom'

我的代码

regex = re.compile(r'(Applicants:)( )?(.*)', re.MULTILINE)
print(regex.findall(text))

我的 output:

[('Applicants:', ' ', 'Silixa Ltd.')]

我需要的是获取 'Applicants:' 和 '\nInventors:' 之间的字符串

'Silixa Ltd.' & 'Chevron U.S.A. Inc. (Incorporated
in USA - California)'

在此先感谢您的帮助

尝试使用 re.DOTALL 代替:

import re

text='''PCT Filing Date: 2 December 2015
\nApplicants: Silixa Ltd.
\nChevron U.S.A. Inc. (Incorporated
in USA - California)
\nInventors: Farhadiroushan,
Mahmoud
\nGillies, Arran
Parker, Tom'''

regex = re.compile(r'Applicants:(.*?)Inventors:', re.DOTALL)
print(regex.findall(text))

给我

$ python test.py
[' Silixa Ltd.\n\nChevron U.S.A. Inc. (Incorporated\nin USA - California)\n\n']

这样做的原因是 MULTILINE 不会让点 (.) 匹配换行符,而 DOTALL 会。

如果您想要的是Applicants:\nInventors:之间的内容,则您的正则表达式应反映:

>>> regex = re.compile(r'Applicants: (.*)Inventors:', re.S)
>>> print(regex.findall(s))
['Silixa Ltd.\n\nChevron U.S.A. Inc. (Incorporated\nin USA - California)\n']

re.S是“点匹配所有”选项,所以我们的(.*)也将匹配新行。 请注意,这与re.MULTILINE不同,因为re.MULTILINE只表示我们的表达式应该应用于多行,但不会改变事实. 不会匹配换行符。 如果. 不匹配换行符,像(.*)这样的匹配仍然会在换行符处停止,无法达到您想要的多行效果。

另请注意,如果您对Applicants:Inventors:不感兴趣,您可能不希望将其放在()之间,如(Inventors:)中的正则表达式,因为匹配将尝试为其创建匹配组。 这就是您在 output 中获得 3 个元素而不是只有 1 个的原因。

如果你想匹配 \nApplicants \nApplicants:\nInventors:之间的所有文本,你也可以在不使用re.DOTALL的情况下获得匹配,以防止不必要的回溯。

匹配Applicants:并在第 1 组中捕获同一行的 rest 以及后面所有不以Inventors:

然后匹配发明家。

^Applicants: (.*(?:\r?\n(?!Inventors:).*)*)\r?\nInventors:
  • ^字符串的开头(如果不必在开头,则使用\b
  • Applicants:字面匹配
  • (捕获组 1
    • .*匹配线的rest
    • (?:\r?\n(?:Inventors.).*)*匹配所有不以 Invertors 开头的行:
  • )关闭组
  • \r?\nInventors:匹配换行符和 Inventors:

正则表达式演示| Python 演示

示例代码

import re
text = ("PCT Filing Date: 2 December 2015\n"
    "Applicants: Silixa Ltd.\n"
    "Chevron U.S.A. Inc. (Incorporated\n"
    "in USA - California)\n"
    "Inventors: Farhadiroushan,\n"
    "Mahmoud\n"
    "Gillies, Arran\n"
    "Parker, Tom'")
regex = re.compile(r'^Applicants: (.*(?:\r?\n(?!Inventors:).*)*)\r?\nInventors:', re.MULTILINE)
print(regex.findall(text))

Output

['Silixa Ltd.\nChevron U.S.A. Inc. (Incorporated\nin USA - California)']

这是一种更通用的方法,可以将这样的字符串解析为其中所有键和值的字典(即,行开头的任何字符串后跟:是键,该键后面的字符串是数据) :

import re 

txt="""\
PCT Filing Date: 2 December 2015
Applicants: Silixa Ltd.
Chevron U.S.A. Inc. (Incorporated
in USA - California)
Inventors: Farhadiroushan,
Mahmoud
Gillies, Arran
Parker, Tom'"""

pat=re.compile(r'(^[^\n:]+):[ \t]*([\s\S]*?(?=(?:^[^\n:]*:)|\Z))', flags=re.M)
data={m.group(1):m.group(2) for m in pat.finditer(txt)}

结果:

>>> data
{'PCT Filing Date': '2 December 2015\n', 'Applicants': 'Silixa Ltd.\nChevron U.S.A. Inc. (Incorporated\nin USA - California)\n', 'Inventors': "Farhadiroushan,\nMahmoud\nGillies, Arran\nParker, Tom'"}

>>> data['Applicants']
'Silixa Ltd.\nChevron U.S.A. Inc. (Incorporated\nin USA - California)\n'

正则表达式的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM