我正在尝试使用正则表达式以在程序中查找误用的运算符。
具体来说,我正在尝试查找是否使用了一些运算符(例如%,$和@),而没有在两侧的数字。
以下是一些滥用示例:
'5%'
'%5'
'5%+3'
'5%%'
是否有一种方法可以通过一次re.search?
我知道我可以至少用+或*至少用0, 但看着:
([^\d]*)(%)([^\d]\*)
我想找到组(1)和组(3)中至少一个存在的情况,
因为在运算符的两侧都很好地插入了%的两边都带有数字。
我知道我可以使用:
match = re.search(r'[^\d\.]+[@$%]', user_request)
if match:
return 'Illegal use of match.group()'
match = re.search(r'[@$%][^\d\.]+', user_request)
if match:
return 'Illegal use of match.group()'
但是我更愿意使用一个re.search行。
而且-当我使用[^ \ d。]时,这是否包括字符串的开头?还是只有不同的字符?
谢谢:)
答案 0 :(得分:2)
您可以使用alternation,前瞻性为负,后置性为负,以断言之前的数字和之后的数字不是数字:
(?<!\d)[@$%]|[@$%](?!\d)
这将匹配:
(?<!\d)
在向后查找负数以检查左侧是否不是数字[@$%]
字符类,匹配@
,$
或%
之一|
或[@$%]
字符类,匹配@
,$
或%
之一(?!\d)
负向查找以检查右边的数字不是数字例如:
match = re.search(r'(?<!\d)[@$%]|[@$%](?!\d)', user_request)
if match:
return 'Illegal use of match.group()'
[^\d.]
不匹配数字或文字点。 character class中的^
否定了其中包含的内容。但是,如果它是字符串的第一个字符而不是数字或点,那么它将匹配。