在python中使用re.findall时,如何在两个子表达式的组合上应用`?`?

时间:2018-09-30 08:27:35

标签: regex python-3.x findall

我想返回所有以字母或数字开头和结尾的单词。它们中最多可以包含一个句点.或连字符-。 因此,ab.ab有效,而ab.无效。

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

由于括号,它不起作用。如何在?的组合上应用[-.][\d\w]+

3 个答案:

答案 0 :(得分:4)

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

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

Regex demo

说明

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

Python demo

答案 1 :(得分:1)

当然,不要进行组捕获。使用(?:pattern)代替(pattern)

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

输出:

['sample', 'text']

答案 2 :(得分:0)

将其设为非捕获组,这样就不会有任何捕获组,这将确保re.findall捕获完全匹配项:

reg = r"[\d\w]+(?:[-.][\d\w]+)?"