当还需要寻找第三组时,如何在Python Regex中搜索至少两个组中的一个?

时间:2018-12-24 15:31:27

标签: python regex regex-group

我正在尝试使用正则表达式以在程序中查找误用的运算符。

具体来说,我正在尝试查找是否使用了一些运算符(例如%,$和@),而没有在两侧的数字。

以下是一些滥用示例:

'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。]时,这是否包括字符串的开头?还是只有不同的字符?

谢谢:)

1 个答案:

答案 0 :(得分:2)

您可以使用alternation,前瞻性为负,后置性为负,以断言之前的数字和之后的数字不是数字:

(?<!\d)[@$%]|[@$%](?!\d)

这将匹配:

  • (?<!\d)在向后查找负数以检查左侧是否不是数字
  • [@$%]字符类,匹配@$%之一
  • |
  • [@$%]字符类,匹配@$%之一
  • (?!\d)负向查找以检查右边的数字不是数字

例如:

match = re.search(r'(?<!\d)[@$%]|[@$%](?!\d)', user_request)
if match: 
    return 'Illegal use of match.group()'

Regex demo | Python demo

[^\d.]不匹配数字或文字点。 character class中的^否定了其中包含的内容。但是,如果它是字符串的第一个字符而不是数字或点,那么它将匹配。