我正在尝试构建一个能够从字符串中提取所有类似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 _ + - 。#]。我的表达的其余部分是在句子末尾排除点的黑客,以及消除逗号的一些解决方法。
答案 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']
我要求在带有单词字符的单词边界后开始标记。之后,我还会捕获尽可能多的单词字符或我明确列出的字符(#+.-
)。因此,如果您想支持另一个角色,只需将其添加到角色类。
最后的负面观察可以防止标签以点结尾。