我有此输入,名称&cp_name(,10)
我的要求是,
注意:这三个都可以用一个或多个空格分隔
(?P<field>[^\s].+?)\s*(?P<col>[&][a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?
我在python中尝试过的正则表达式 我希望与3个被捕获的小组进行一场比赛
我得到了2个匹配项
第一场比赛:
第二场比赛:
答案 0 :(得分:0)
对于字段组,您可以先不匹配空格字符,然后再匹配任何非空格字符。
由于字段组可以包含空格,因此您可以重复该操作,并确保单词不以&
开头或以括号开头和结尾。
^(?P<field>(?![^\s&]*&)\S+(?: (?!\([^)]*\)|[^&\s]*&)\S+)*)\s*(?P<col>&[a-zA-Z_]+)?\s*(?P<pos>\(.*?\))?$
^
字符串的开头(?P<field>
命名组字段
(?![^\s&]*&)\S+
断言右边的内容不包含&
,然后匹配1倍以上的非空格字符[^\s&]\S+
不匹配空格字符或&
,然后匹配1倍以上的非空格字符(?:
非捕获组
(?!\([^)]*\))\S+
断言右边的内容不是(
... )
,然后匹配1+倍非空格字符)*
关闭非捕获组并重复0次以上)
关闭组字段\s*(?P<col>&[a-zA-Z_]+)?
匹配可选的col
组\s*(?P<pos>\(.*?\))?
匹配可选的pos
组请注意,您可以省略[&]
周围的方括号