[英]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:示例代码
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.