正则表达式 - 使用*和一组字符

时间:2013-02-13 14:41:51

标签: python regex

我在正则表达式上相当新,我遇到了一个我无法弄清楚的问题:

我正在尝试匹配一组以任意数量的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] +以确保括号内至少有一个数字。

感谢快速回答,全部!

5 个答案:

答案 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 ']