在我的正则表达式中找不到错误

时间:2013-12-20 02:00:14

标签: python regex

我正在尝试构建一个能够从字符串中提取所有类似Stackoverflow的标记的正则表达式。我的正则表达式有问题,我找不到:

s = 'call,me r c++ c# 132(list) 2345sdf;sdf_sfg? "adf-sdf aso.net?'
re.findall(r"[^,\s;\"\(\)]*[a-zA-Z0-9_\+\-\.#]*[a-zA-Z0-9_\+\-#]", s.lower())

我正在

['call',
 'r',
 'c++',
 'c#',
 '132',
 'list',
 '2345sdf',
 'sdf_sfg',
 'adf-sdf',
 'aso.net']

所以当你看到逗号丢失后的“我”时。我也愿意改进我的正则表达式。

编辑:我想匹配的模式是有效的SO标签,即集合中的所有字符[a-zA-Z0-9 _ + - 。#]。我的表达的其余部分是在句子末尾排除点的黑客,以及消除逗号的一些解决方法。

1 个答案:

答案 0 :(得分:2)

>>> s = 'call,me r c++ c# 132(list) 2345sdf;sdf_sfg? "adf-sdf aso.net? foo. bar.'
>>> re.findall(r'\b\w[\w#+.-]*(?<!\.)', s)
['call', 'me', 'r', 'c++', 'c#', '132', 'list', '2345sdf', 'sdf_sfg', 'adf-sdf', 'aso.net', 'foo', 'bar']

我要求在带有单词字符的单词边界后开始标记。之后,我还会捕获尽可能多的单词字符或我明确列出的字符(#+.-)。因此,如果您想支持另一个角色,只需将其添加到角色类。

最后的负面观察可以防止标签以点结尾。