1

我正在尝试执行以下操作:从字符串列表中提取第一次出现(可能有多个)空格之前的任何内容,然后是圆括号“(”。

我尝试了以下方法:

re.findall("(.*)\s\(", line))

但它给出了例如以下字符串的扭曲结果:

Carrollton(西乔治亚大学)[2]*Dahlonega(北乔治亚学院和州立大学)[2]

提前致谢

4

2 回答 2

1

您可以为此使用前瞻。试试这个正则表达式:

[a-z A-Z]+(?=[ ]+[\(]+)
于 2020-04-13T14:57:20.390 回答
1

要在第一次出现空白字符前提取任何内容,然后是圆括号(,您可以使用re.search(此方法仅用于提取第一个匹配项):

re.search(r'^(.*?)\s\(', text, re.S).group(1)
re.search(r'^\S*(?:\s(?!\()\S*)*', text).group()

请参阅regex #1 demoregex #2 demos。请注意,第二个虽然更长,但效率更高,因为它遵循展开循环原则

细节

  • ^- 字符串的开始
  • (.*?)- 第 1 组:尽可能少的任何 0+ 个字符,
  • \s\(- 一个空格和(字符。

或更好:

  • ^\S*- 字符串开头,然后是 0+ 个非空白字符
  • (?:\s(?!\()\S*)*- 0 次或多次出现
    • \s(?!\()- 后面没有跟的空白字符(
    • \S*- 0+ 非空白字符

请参阅Python 演示

import re
strs = ['Isla Vista (University of California, Santa Barbara)[2]','Carrollton (University of West Georgia)[2]','Dahlonega (North Georgia College & State University)[2]']
rx = re.compile(r'^\S*(?:\s(?!\()\S*)*', re.S)
for s in strs:
    m = rx.search(s) 
    if m:
        print('{} => {}'.format(s, m.group()))
    else:
        print("{}: No match!".format(s))
于 2020-04-13T18:18:09.677 回答