Python Regex findall:获取准确的字符串

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

我正在尝试使用 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|
python-3.x regex findall
1个回答
0
投票

您可能会使用:

^efgh\b(?!\.).*

说明

  • ^
    字符串开始
  • efgh\b
    匹配“单词”
    efgh
  • (?!\.)
    负前瞻,断言右边不是字面上的点
  • .*
    匹配行的其余部分

正则表达式演示 | Python演示

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
返回捕获组的值(如果存在)。如果你想要完整匹配,你可以省略捕获组。

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