正则表达式来解析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']
在组开始时,?:
只是简单地告诉正则表达式引擎不要将其视为结果的组。
答
你可以使用一个负回顾后:
re.findall(r'(?<!\w)(-\w+)', s)
的(?<!\w)
部分的意思是“只有当没有一个字字符前面的比赛”。
非常感谢,马克。你会得到支票,但我会用Ignacio的解决方案,因为它更短。 – dlw 2010-06-11 01:35:33
@dlw:你似乎对检查的含义感到困惑。这并不意味着“这个答案是最快的答案”,这意味着“这就是我要使用的答案”。你应该检查Ignacio的答案。 – tzot 2010-06-11 09:43:35
对不起马克,支票去伊格纳西奥 – dlw 2010-08-26 01:20:27