Python正则表达式,用于查找分隔符之间的特殊字符



给定一个字符串,我想生成一个只匹配无效的特定字符的正则表达式,例如"分号",它是而不是在括号或圆括号内。我可以写一个匹配相反情况的模式,但我如何反转(例如^)该模式?

EDIT:我应该注意,我需要一个通用的解决方案,其中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

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

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

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

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

;(?![a-z]])

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

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

在lookbackground中可以做什么有一些限制,特别是使用"*"或"+"量词是不可能的。

如果您对正则表达式匹配整个无效部分感到满意,那么另一种选择是使用类似的内容。如果需要,您可以使用捕获组来提取分号。

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

最新更新