我在正则表达式上相当新,我遇到了一个我无法弄清楚的问题:
我正在尝试匹配一组以任意数量的AZ,0-9和_字符开头的字符,这些字符可以选择后跟一个括在一组括号中的数字,并且可以与原始字符分开字符串由空格(或不是)
应该找到的例子:
_ABCD1E
_123FD(13)
ABDF1G (2)
这是我目前的正则表达式:
[A-Z_0-9]+\s*\({0,1}[\d]*\){0,1}
它发现一切都很好,但如果我有以下内容则存在问题:
_ABCDE )
它应该只抓取_ABCDE而不是“)”,但它目前抓住'_ABCDE''
如果整个模式不存在,是否有某些方法可以获取(#)但不会获得额外的字符?
如果可能的话,请解释语法,因为我的目的是学习,而不仅仅是得到答案。
答案:以下代码适用于我目前所需的内容:
[A-Z_0-9]+(\s*\([\d]+\)){0,1}
# or, as has been mentioned, the above can be simplified
# and cleaned up a bit to be
[A-Z_0-9]+(\s*\(\d+\))?
# The [] around \d are unnecessary and {0,1} is equivalent to ?
在(#)模式周围添加括号允许使用?整个模式或{0,1}。我还将[\ d] *更改为[\ d] +以确保括号内至少有一个数字。
感谢快速回答,全部!
答案 0 :(得分:1)
你的正则表达式说,每个paren(开放和关闭)可能是也可能不存在,独立。相反,你应该说数字封闭的数据可能存在也可能不存在:
(\([\d]*\)){0,1}
请注意,这允许在parens中没有任何内容;这就是你的正则表达式所说的,但我不清楚这是你真正想要的。
答案 1 :(得分:0)
怎么样
^[A-Z0-9_]+\s*(\([0-9]+\))?$
顺便说一下,在您的示例中,第一部分不仅接受[A-Z_]
,还接受[0-9]
答案 2 :(得分:0)
这似乎可以胜任。
[1-9A-Z_]+\s*(?:\([1-9]*\))?
答案 3 :(得分:0)
您似乎想要以下正则表达式:
^[A-Z\d_]+(\s*\(\d+\))?$
答案 4 :(得分:0)
我使用非捕获组来避免在结果中对匹配进行分组:
>>> pattern = r'[A-Z_]+\s*(?:\(\d+\)|\d*)'
>>> l = ['_ABCD1E', '_123FD(13)', 'ABDF1G (2)', '_ABCDE )', 'A_B (15)', 'E (345']
>>> [re.search(pattern , i).group() for i in l]
['_ABCD1', '_123', 'ABDF1', '_ABCDE ', 'A_B (15)', 'E ']