2

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

我正在尝试匹配以任意数量的 AZ、0-9 和 _ 字符开头的字符集,这些字符可以选择后跟一个括在一组括号中的数字,并且可以通过 a 与原始字符串分隔空间(或没有)

这应该找到的示例:

_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]+ 以确保括号内至少有一个数字。

感谢您的快速回答,所有!

4

5 回答 5

1

您的正则表达式表示每个括号(打开和关闭)可能独立存在也可能不存在。相反,您应该说 number-enclosed-in-parens 可能存在也可能不存在:

(\([\d]*\)){0,1}

请注意,这允许括号中没有任何内容;这就是你的正则表达式所说的,但我不清楚这就是你真正想要的。

于 2013-02-13T14:47:40.713 回答
0

怎么样

^[A-Z0-9_]+\s*(\([0-9]+\))?$

顺便说一句,从你的例子中,第一部分不仅接受[A-Z_],而且[0-9]

于 2013-02-13T14:50:40.793 回答
0

这似乎可以完成这项工作。

[1-9A-Z_]+\s*(?:\([1-9]*\))?
于 2013-02-13T14:51:04.047 回答
0

您似乎想要以下正则表达式:

^[A-Z\d_]+(\s*\(\d+\))?$
于 2013-02-13T14:52:32.567 回答
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 ']
于 2013-02-13T14:54:09.697 回答