regex - python 3 : subgroup matches not working for OR '|' joined regular expressions

标签 regex python-3.x

我正在尝试解析 csv 文件中的一些行以提取一系列数字。有两种可能的格式,单独的数字,或嵌入在较长代码中的数字。

这是一个代码示例,说明我在做什么,以及出了什么问题:

# regex works
>>> re.search('^(\d+)$', '5755').group(0, 1)
('5755', '5755')

# regex works with capturing group inside non-capturing group
>>> re.search('(?:^(\d+)$)', '5755').group(0, 1)
('5755', '5755')

# regex does not work as second of two non-capturing groups
>>> re.search('(?:\$SK-*(\d+)[-K])|(?:^(\d+)$)', '5755').group(0, 1)
('5755', None)

# the other regex of the pair works
>>> re.search('(?:\$SK-*(\d+)[-K])|(?:^(\d+)$)', '11$SK-2301-K13').group(0, 1)
('$SK-2301-', '2301')

# the regex works as the first of two non-capturing groups
>>> re.search('(?:^(\d+)$)|(?:\$SK-*(\d+)[-K])', '5755').group(0, 1)
('5755', '5755')

如您所见,正则表达式本身或包裹在 (?...) 中工作正常,但当与另一个正则表达式结合时,两个正则表达式中的第二个组停止工作,即使搜索返回匹配对象。但是,如果我随后交换通过管道传输的正则表达式的顺序,第一个仍然可以工作,无论它是哪个正则表达式。

需要说明的是,当我将两个可用的正则表达式与竖线 ('|') 组合在一起时,第一个上的组将起作用,但第二个上的组将不起作用。

为什么会这样?我该如何解决这个问题?

最佳答案

问题的原因在于,对子组工作方式的直观理解并不是他们在实践中的工作方式。

我将详细说明关于您的问题的两条不同评论正确指出的内容。 子组在捕获时没有编号,而是在创建/解析正则表达式时固定。例如:

re.search('match:(foo)','match:foo').group(1)

会是

('foo')

因为第一个捕获组是(foo)。同样

re.search('match:(foo)(bar)','match:foobar').group(1,2)

将是

('foo','bar')

因为第一个和第二个捕获组是(foo)(bar),并且每个都被匹配和捕获。

以这样的模式

match:(?:(foo)|(bar))

(foo)(bar) 仍然是第一个和第二个捕获组,即使由于 OR | 只有其中一个可以捕获

re.search('match:(?:(foo)|(bar))','match:foo').group(1,2)
re.search('match:(?:(foo)|(bar))','match:bar').group(1,2)

会输出

('foo', None)
(None, 'bar')

因此,您需要在代码中添加一些逻辑来检查哪个捕获组有内容并返回那个。

关于regex - python 3 : subgroup matches not working for OR '|' joined regular expressions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46161129/

相关文章:

regex - Perl 就地替换

java - 字符串中允许的字符的正则表达式返回 false

python - 如何在 python 中捕获文本并同时替换它?

Python3 PIL (Pillow) draw.pieslice 坏弧

python-3.x - 如何从 target.com 产品页面抓取产品价格?

.net - 正则表达式匹配右括号不在引号中

用于手机号码验证的正则表达式

python - 如果我想捕获并记录(而不是引发)异常,KeyboardInterrupt 应该是唯一引发的异常吗?

python - sys.modules 有任何特定的顺序吗?

python - 使函数可调用的函数无法正常工作