在python中结合正向和反向前瞻

2024-10-04 11:29:35 发布

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

我试图提取满足许多条件的令牌,其中,我使用lookahead实现以下两个条件:

  1. 标记必须是数字/字母数字(即,它们必须至少有一个数字)。它们可以包含一些特殊字符,如-'-','/','\','.','_'

我想匹配如下字符串:165271agya678yah@123kj*12-

  1. 令牌不能具有连续的特殊字符,如:ajh12-&

我不想匹配如下字符串:ajh12-&671%&i^

我对第一个条件使用正向前瞻:(?=\w*\d\w*),对第二个条件使用负向前瞻:(?!=[\_\.\:\;\-\\\/\@\+]{2})

我不知道如何结合这两个前瞻性条件

任何建议都会有帮助。提前谢谢

编辑1

我还想提取作为较大字符串的一部分的完整标记(即,它们可能出现在字符串的中间)

我想匹配字符串中的所有标记: 165271 agya678 yah@123 kj*12-

字符串中没有任何标记(甚至不是标记的一部分):ajh12-& 671%&i^

< >为了强制正则表达式考虑整个字符串,在上面的正则表达式中也使用了^ {CD13>}:^ {< CD14>}和^ {CD15>}


Tags: 字符串标记编辑字母数字条件建议lookahead
2条回答

你可以用

^(?!=.*[_.:;\-\\\/@+*]{2})(?=[^\d\n]*\d)[\w.:;\-\\\/@+*]+$

Regex demo

负前瞻(?=[^\d\n]*\d)匹配除数字或换行符以外的任何字符。使用一个否定字符类,然后匹配一个数字

请注意,您还必须添加*,并且大多数字符不必在character类中转义

使用对比度,您还可以将第一个.*转换为一个否定字符类,以防止一些回溯

^(?!=[^_.:;\-\\\/@+*\n][_.:;\-\\\/@+*]{2})(?=[^\d\n]*\d)[\w.:;\-\\\/@+*]+$

编辑

如果没有锚,您可以在左侧(?<!\S)和右侧(?!\S)使用空白边界

(?<!\S)(?!=\S*[_.:;\-\\\/@+*]{2})(?=[^\d\s]*\d)[\w.:;\-\\\/@+*]+(?!\S)

Regex demo

您可以使用多个前瞻断言来仅捕获

  1. (?!.*(?:\W|_){2,}.*)-没有连续的特殊字符和
  2. (?=.*\d.*)-至少有一个数字
^(?!.*(?:\W|_){2,}.*)(?=.*\d.*).*$

相关问题 更多 >