我正在尝试使用 python re.findall 获取所需的字符串。字符串如下。
abcd|123|ABCD|112233|
abcd|234|ABCD|112233|
abcd.abc|123|ABCD|112233|
efgh|234|EFGH|445566|
efgh|4567|EFGH|445566|
efgh.abc|6789|EFGH|445566|
efgh.abc|4567|EFGH|445566|
xyz|567|XYZ|557799|
xyz.abc|567|XYZ|557799|
我需要所有以“efgh”开头的行,所以我正在使用 re.findall('efgh.', data),但我得到的结果如下所示。我只需要前两行(efgh 行,而不是 efgh .abc)。我可以使用 re.search('efhg(.)', data).group 得到相同的结果,但只得到第一行而缺少第二行。请帮助我如何实现这一目标。
efgh|234|EFGH|445566| <- These two rows
efgh|4567|EFGH|445566| <-
efgh.abc|6789|EFGH|445566|
efgh.abc|4567|EFGH|445566|
您可能会使用:
^efgh\b(?!\.).*
说明
^
字符串开始efgh\b
匹配“单词”efgh
(?!\.)
负前瞻,断言右边不是字面上的点.*
匹配行的其余部分import re
pattern = r"^efgh\b(?!\.).*"
s = ("abcd|123|ABCD|112233|\n"
"abcd|234|ABCD|112233|\n"
"abcd.abc|123|ABCD|112233|\n"
"efgh|234|EFGH|445566|\n"
"efgh|4567|EFGH|445566|\n"
"efgh.abc|6789|EFGH|445566|\n"
"efgh.abc|4567|EFGH|445566|\n"
"xyz|567|XYZ|557799|\n"
"xyz.abc|567|XYZ|557799|")
print(re.findall(pattern, s, re.M))
输出
['efgh|234|EFGH|445566|', 'efgh|4567|EFGH|445566|']
或者如果总是有一个管道跟随:
^efgh\|.*
请注意,
re.findall
返回捕获组的值(如果存在)。如果你想要完整匹配,你可以省略捕获组。