给定一个字符串,我想创建一个只匹配无效的特定字符的正则表达式,例如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
答案 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|$)