使用正则表达式 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]
你不需要为此使用正则表达式,你可能会在包含 a
和 blu
的行之间得到行:
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
以及除换行符以外的任何零个或多个字符尽可能多。
你好,我有这个字符串,我需要根据一些分隔符从中提取一些子字符串:
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]
你不需要为此使用正则表达式,你可能会在包含 a
和 blu
的行之间得到行:
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
以及除换行符以外的任何零个或多个字符尽可能多。