Python regex在分隔符之间查找特殊字符

2024-04-25 01:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个字符串,我想创建一个只匹配无效的特定字符的正则表达式,例如“分号”,即括号或圆括号中的而不是。我可以编写一个匹配相反大小写的模式,但是如何反转(例如^)模式呢?在

编辑:我需要一个通用的解决方案,其中分号和分隔符之间可以存在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

Tags: the字符串retrue编辑模式字符括号
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

或者

^{pr2}$

你可以用消极的向前看和向后看。要查找;后面没有字母和方括号的示例,可以执行以下操作:

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

添加一个lookbehind可以得到如下效果:

^{pr2}$

在lookbehind中有一些限制,尤其是不能使用“*”或“+”量词。在

如果您希望正则表达式与整个无效部分匹配,另一种方法是使用类似的方法。如果需要,可以使用一个捕获组来提取分号。在

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

相关问题 更多 >