使用正则表达式 python 提取子字符串

Extract subtring using regex python

你好,我有这个字符串,我需要根据一些分隔符从中提取一些子字符串:

string = """
1538 a
123
skua456
789
5
g
15563 blu55g
b
456
16453 a
789
5
16524 blu
g
55
1734 a
987
987
55
aasf
552
18278 blu
ttry
"""

我需要准确提取这些字符串:

string1 = 
"""
1538 a
123
skua456
789
5
g
15563 blu55g
"""
string2 = """
16453 a
789
5
16524 blu
"""
string3 = 
"""
1734 a
987
987
55
aasf
552
18278 blu
"""

我尝试了很多类型:re.findall、re.search、re.match。但是我从来没有得到预期的结果。

例如:以下代码打印所有字符串:

re.split(r"a(.*)blu", a)[0]

你不需要为此使用正则表达式,你可能会在包含 ablu 的行之间得到行:

text = "1538 a\n123\nskua456\n789\n5\ng\n15563 blu55g\nb\n456\n16453 a\n789\n5\n16524 blu\ng\n55\n1734 a\n987\n987\n55\naasf\n552\n18278 blu\nttry"
f = False
result = []
block = []
for line in text.splitlines():
    if 'a' in line:
        f = True
    if f:
        block.append(line)
    if 'blu' in line and f:
        f = False
        result.append("\n".join(block))
        block = []

print(result)
# => ['1538 a\n123\nskua456\n789\n5\ng\n15563 blu55g', '16453 a\n789\n5\n16524 blu', '1734 a\n987\n987\n55\naasf\n552\n18278 blu']

参见Python demo

有了正则表达式,你可以使用

print( re.findall(r'(?m)^.*a(?s:.*?)blu.*', text) )
print( re.findall(r'(?m)^.*a(?:\n.*)*?\n.*blu.*', text) )

参见 this Python demo

first regex表示:

  • (?m)^ - 多行模式打开,因此 ^ 匹配任何行开始位置
  • .*a - 除换行字符外的任何零个或多个字符,然后 a
  • (?s:.*?) - 任何零个或多个字符,包括尽可能少的换行符
  • blu.* - blue 然后除换行符之外的任何零个或多个字符尽可能多。

second regex 匹配

  • (?m)^ - 行首
  • .*a - 除换行字符外的任何零个或多个字符,然后 a
  • (?:\n.*)*? - 零行或多行,越少越好
  • \n.*blu.* - 一个换行符,除换行符以外的任何零个或多个字符尽可能多,blu 以及除换行符以外的任何零个或多个字符尽可能多。