正则表达式来解析Python中的选项字符串

问题描述:

我似乎无法创建正确的正则表达式从我的字符串中提取正确的标记。填充字符串的开头使用一个空间中产生正确的输出,但似乎不太理想:正则表达式来解析Python中的选项字符串

>>> import re 
>>> s = '-edge_0triggered a-b | -level_Sensitive c-d | a-b-c' 
>>> re.findall(r'\W(-[\w_]+)',' '+s) 
['-edge_0triggered', '-level_Sensitive'] # correct output 

这里有一些正则表达式我试过的,没有任何人有一个正则表达式的建议,不涉及改变原来的字符串,并产生正确的输出

>>> re.findall(r'(-[\w_]+)',s) 
['-edge_0triggered', '-b', '-level_Sensitive', '-d', '-b', '-c'] 
>>> re.findall(r'\W(-[\w_]+)',s) 
['-level_Sensitive'] 

r'(?:^|\W)(-\w+)' 

\w已经包含下划线。

更改第一预选赛接受一个开始锚或不字,而不是仅仅一个不字:

>>> re.findall(r'(?:^|\W)(-[\w_]+)', s) 
['-edge_0triggered', '-level_Sensitive'] 

在组开始时,?:只是简单地告诉正则表达式引擎不要将其视为结果的组。

+0

非常感谢,马克。你会得到支票,但我会用Ignacio的解决方案,因为它更短。 – dlw 2010-06-11 01:35:33

+0

@dlw:你似乎对检查的含义感到困惑。这并不意味着“这个答案是最快的答案”,这意味着“这就是我要使用的答案”。你应该检查Ignacio的答案。 – tzot 2010-06-11 09:43:35

+0

对不起马克,支票去伊格纳西奥 – dlw 2010-08-26 01:20:27

你可以使用一个负回顾后:

re.findall(r'(?<!\w)(-\w+)', s) 

(?<!\w)部分的意思是“只有当没有一个字字符前面的比赛”。