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']