2013-12-20 27 views
0

我想构建一个正则表达式,能够从字符串中提取所有类似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 _ + - 。#]中的所有字符。我的其他表达方式是排除句子末尾的小点,并采取一些解决方法来消除逗号。

+2

你想匹配什么样的模式? – thefourtheye

+0

@thefourtheye编辑了这个问题。 – elyase

+1

我运行了你的例子,它在我的python 2.7.3 Win 7上很好。确保你的Python是最新的。也适用于嵌入不可见字符或字符串编码问题等奇怪的事情。 – Gene

回答

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'] 

我需要用单词字符在单词边界之后开始标签。之后,我还会捕捉尽可能多的单词字符或我明确列出的单词(#+.-)。所以如果你想支持另一个角色,只需将它添加到角色类。

最后的消极lookbehind防止标签以点结束。

+0

我能做些什么来排除字符串的最后一个点? – elyase

+1

@elyase:你可以在模式的末尾添加一个负面倒序:'(?<!\。$)' –

+0

编辑我的答案。 – poke