我正在尝试执行以下操作:从字符串列表中提取第一次出现(可能有多个)空格之前的任何内容,然后是圆括号“(”。
我尝试了以下方法:
re.findall("(.*)\s\(", line))
但它给出了例如以下字符串的扭曲结果:
Carrollton(西乔治亚大学)[2]*Dahlonega(北乔治亚学院和州立大学)[2]
提前致谢
我正在尝试执行以下操作:从字符串列表中提取第一次出现(可能有多个)空格之前的任何内容,然后是圆括号“(”。
我尝试了以下方法:
re.findall("(.*)\s\(", line))
但它给出了例如以下字符串的扭曲结果:
Carrollton(西乔治亚大学)[2]*Dahlonega(北乔治亚学院和州立大学)[2]
提前致谢
您可以为此使用前瞻。试试这个正则表达式:
[a-z A-Z]+(?=[ ]+[\(]+)
要在第一次出现空白字符前提取任何内容,然后是圆括号(
,您可以使用re.search
(此方法仅用于提取第一个匹配项):
re.search(r'^(.*?)\s\(', text, re.S).group(1)
re.search(r'^\S*(?:\s(?!\()\S*)*', text).group()
请参阅regex #1 demo和regex #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))