REGEX_String 在列表中的字符串之间
REGEX_String between strings in a list
来自这个列表:
['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
我想把它缩减到这个列表:
['BELMONT PARK', 'EAGLE FARM']
从第一个列表可以看出,想要的词在'\n'
和'('
之间。
我尝试的解决方案是:
for i in x:
result = re.search('\n(.*)(', i)
print(result.group(1))
这个returns错误'unterminated subpattern'。
谢谢
你收到一个错误,因为 (
没有被转义。无论如何,它不会起作用,因为您将得到以下匹配项:
\nBELMONT PARK (
\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (
您可以尝试以下方法:
(?<=\n)(?!.*\n)(.*)(?= \()
(?<=\n)
:正向后视以确保 \n
在匹配 之前
(?!.*\n)
:否定前瞻以确保不再包含 \n
(.*)
:你的对手
(?= \()
:确保 (
在 match 之后的积极前瞻
您可以在不使用任何环视的情况下获得匹配项,因为您已经在使用捕获组。
\n(.*) \(
说明
\n
匹配一个换行符
(.*)
捕获组1,尽可能匹配除换行符外的任意字符
\(
匹配一个space和(
看到一个regex101 demo and a Python demo.
例子
import re
x = ['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
pattern = r"\n(.*) \("
for i in x:
m = re.search(pattern, i)
if m:
print(m.group(1))
输出
BELMONT PARK
EAGLE FARM
如果你想return一个列表:
x = ['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
pattern = r"\n(.*) \("
res = [m.group(1) for i in x for m in [re.search(pattern, i)] if m]
print(res)
输出
['BELMONT PARK', 'EAGLE FARM']
来自这个列表:
['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
我想把它缩减到这个列表:
['BELMONT PARK', 'EAGLE FARM']
从第一个列表可以看出,想要的词在'\n'
和'('
之间。
我尝试的解决方案是:
for i in x:
result = re.search('\n(.*)(', i)
print(result.group(1))
这个returns错误'unterminated subpattern'。 谢谢
你收到一个错误,因为 (
没有被转义。无论如何,它不会起作用,因为您将得到以下匹配项:
\nBELMONT PARK (
\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (
您可以尝试以下方法:
(?<=\n)(?!.*\n)(.*)(?= \()
(?<=\n)
:正向后视以确保\n
在匹配 之前
(?!.*\n)
:否定前瞻以确保不再包含\n
(.*)
:你的对手(?= \()
:确保(
在 match 之后的积极前瞻
您可以在不使用任何环视的情况下获得匹配项,因为您已经在使用捕获组。
\n(.*) \(
说明
\n
匹配一个换行符(.*)
捕获组1,尽可能匹配除换行符外的任意字符\(
匹配一个space和(
看到一个regex101 demo and a Python demo.
例子
import re
x = ['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
pattern = r"\n(.*) \("
for i in x:
m = re.search(pattern, i)
if m:
print(m.group(1))
输出
BELMONT PARK
EAGLE FARM
如果你想return一个列表:
x = ['AUSTRALIA\nBELMONT PARK (WA', '\nR3\n1/5/4/2\n2/3/1/5\nEAGLE FARM (QLD']
pattern = r"\n(.*) \("
res = [m.group(1) for i in x for m in [re.search(pattern, i)] if m]
print(res)
输出
['BELMONT PARK', 'EAGLE FARM']