如何创建非捕获组(在 python 中使用 re.findall 时如何对两个子表达式的组合应用`?`)?

问题描述 投票:0回答:3

我想返回所有以字母或数字开头和结尾的单词。它们最多可以在单词中包含一个句号

.
或连字符
-
。 因此,
ab.ab
有效,但
ab.
无效。

import re
reg = r"[\d\w]+([-.][\d\w]+)?"
s = "sample text"
print(re.findall(reg, s))

由于括号的原因,它不起作用。如何将

?
应用于
[-.][\d\w]+

的组合
regex python-3.x findall
3个回答
4
投票

如果

ab.
无效且不应匹配,并且句点或连字符不应位于开头或结尾,您可以匹配一个或多个数字或字符,后跟与匹配的可选部分点或连字符后跟一次或多次数字或字符。

(?<!\S)[a-zA-Z\d]+(?:[.-][a-zA-Z\d]+)?(?!\S)

正则表达式演示

解释

  • (?<!\S)
    负向后查找断言左侧不是非空白字符
  • [a-zA-Z\d]+
    匹配小写/大写字符或数字一次或多次
  • (?:[.-][a-zA-Z\d]+)?
    可选的非捕获组,将匹配点或连字符后跟或多次小写/大写字符或数字
  • (?!\S
    负向前瞻断言右侧的内容不是非空白字符。

Python 演示


1
投票

当然,不要进行群抓。使用

(?:pattern)
代替
(pattern)
:

import re
reg = r"[\d\w]+(?:[-.][\d\w]+)?"
s = "sample text"
print(re.findall(reg, s))

输出:

['sample', 'text']

0
投票

改为非捕获组,这样就不会出现任何捕获组,这将确保完整的匹配被

re.findall
捕获:

reg = r"[\d\w]+(?:[-.][\d\w]+)?"
© www.soinside.com 2019 - 2024. All rights reserved.