Python正则表达式在分隔符之间查找特殊字符

时间:2015-11-19 00:14:07

标签: python regex

给定一个字符串,我想创建一个只匹配无效的特定字符的正则表达式,例如a"分号,"在括号或括号内找到 not 。我能够编写一个匹配相反情况的模式,但是如何反转(例如^)模式?

编辑:我应该注意,我需要一个通用的解决方案,分号和分隔符之间可以存在n长字符;不仅是零宽度匹配。

>>> invalid = '2#2;a,a [4,4;b/b]'
>>> valid = '(2#2;a,a) [4,4;b/b]'
>>> pattern = r'(\(.+?\;.+?\))|(\[.+?\;.+?\])'      # finds valid cases; want the opposite

# Result
>>>bool(re.findall(pattern, invalid))                
True                                              # overlooks the invalid subset '2;a'
>>> not re.findall(pattern, valid)
True

# Desired result
>>>bool(re.findall(pattern_inverse, invalid))
True
>>> bool(re.findall(pattern_inverse, valid))
False

2 个答案:

答案 0 :(得分:2)

使用交替运算符。捕获的;必须存在于这些括号之外的那个。

>>> import re
>>> invalid = '2;a [4;b]'
>>> valid = '(2;a) [4;b]'
>>> pattern = r'(?:\([^()]*;[^()]*\)|\[[^\[\]]*\;[^\[\]]*\])|(;)'
>>> re.findall(pattern, invalid)
[';', '']
>>> re.findall(pattern, valid)
['', '']
>>> any(re.findall(pattern, invalid))
True
>>> any(re.findall(pattern, valid))
False

OR

>>> pattern = r';(?![^()]*\)|[^\[\]]*\])'
>>> any(re.findall(pattern, invalid))
True
>>> any(re.findall(pattern, valid))
False
>>> re.findall(pattern, invalid)
[';']
>>> re.findall(pattern, valid)
[]
>>> 

答案 1 :(得分:0)

你可以使用负向前瞻和后视。要查找;后面没有字母和方括号的示例,您可以执行以下操作:

;(?![a-z]\])

添加一个lookbehind会给你这样的东西:

(?<!\[[0-9]);(?![a-z]\])

对于你在lookbehind中可以做什么有一些限制 - 特别是使用“*”或“+”量词是不可能的。

另一种方法是,如果您对正则表达式匹配整个无效部分感到满意​​,那就是使用类似的东西。然后,如果需要,您可以使用捕获组来提取分号。

(?<=^|\s)[^(\[]*;[^)\]]*(?=\s|$)