我想返回所有以字母或数字开头和结尾的单词。它们中最多可以包含一个句点.
或连字符-
。
因此,ab.ab
有效,而ab.
无效。
import re
reg = r"[\d\w]+([-.][\d\w]+)?"
s = "sample text"
print(re.findall(reg, s))
由于括号,它不起作用。如何在?
的组合上应用[-.][\d\w]+
答案 0 :(得分:4)
如果ab.
无效且不应匹配,并且句号或连字符不应位于开头或结尾,则可以匹配一个或多个数字或字符,后跟可选字符与点或连字符匹配的部分,后跟一个或多个数字或字符。
(?<!\S)[a-zA-Z\d]+(?:[.-][a-zA-Z\d]+)?(?!\S)
说明
(?<!\S)
后面的负数表示左边不是非空白字符[a-zA-Z\d]+
一次或多次匹配小写/大写字符或数字(?:[.-][a-zA-Z\d]+)?
可选的非捕获组,将与点或连字符匹配,后跟或更多次匹配小写/大写字符或数字(?!\S
负向超前,断言右侧的字符不是非空格字符。答案 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]+)?"