Python Regex findall:获取精确字符串

wsxa1bj1  于 2023-04-13  发布在  Python
关注(0)|答案(1)|浏览(130)

我尝试使用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|
mxg2im7a

mxg2im7a1#

您可以用途:

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

说明

  • ^字符串开头
  • 匹配“单词”efgh
  • (?!\.)负先行,Assert不是右侧的文字点
  • .*匹配行的其余部分

Regex demo|Python demo

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\|.*

Regex demo
请注意,如果存在捕获组,re.findall将返回该捕获组的值。如果需要完全匹配,可以省略捕获组。

相关问题