为了账号安全,请及时绑定邮箱和手机立即绑定

使用正则表达式的 Python 中的空格后跟括号(非惰性)

使用正则表达式的 Python 中的空格后跟括号(非惰性)

慕田峪7331174 2022-10-06 19:54:10
我正在尝试执行以下操作:从字符串列表中提取第一次出现(可能不止一个)空格之前的任何内容,然后是圆括号“(”。我尝试了以下方法:re.findall("(.*)\s\(", line))但它给出了例如以下字符串的扭曲结果:Carrollton(西乔治亚大学)[2]*Dahlonega(北乔治亚学院和州立大学)[2]提前致谢
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

要在第一次出现空白字符之前提取任何内容,然后是圆括号(,您可以使用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))


查看完整回答
反对 回复 2022-10-06
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

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

[a-z A-Z]+(?=[ ]+[\(]+)


查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号