如何基于正则表达式删除带有异常的行

How to remove a line based on a regular expression with exceptions

我需要删除具有以下特征的行。

<img src="index-1_2.jpg"/><br>
<img src="index-1_3.jpg"/><br>
<img src="index-1_5.jpg"/><br>
<img src="index-2_1.jpg"/><br>
<img src="index-2_5.jpg"/><br>
<img src="index-3_1.png"/><br>
<img src="index-23_8.png"/><br>
<img src="index-22_9.png"/><br>
<img src="index-22_1.jpg"/><br>
<img src="index-22_2.jpg"/><br>
<img src="index-99_5.png"/><br>
<img src="index-100_5.png"/><br>
<img src="index-1000_5.png"/><br>
...

如您所见,在单词 index 和 _ 之后找到的数字,图像格式(png、jpg)也各不相同。

我需要生成一个正则表达式来删除在 index 之后找到的所有这些行 EXECPTING 数字。例如,我需要保留只有数字 1 和 2 的行。

我有以下生成的正则表达式

^<img src="index-(?!2|1)\d+_\d+\.(?:jpg|png)"\/><br>$

但是想要保留数字 1 和 2,它还会保留数字 22、23、100 和 1000,因为它们包含这些数字

使用

^<img src="index-(?![12]_)(\d+)_\d+\.(?:jpg|png)"\/><br>$

参见regex proof。使用 </code> 作为替换。</p> <p><strong>解释</strong></p> <pre><code>-------------------------------------------------------------------------------- ^ the beginning of the string -------------------------------------------------------------------------------- <img src="index- '<img src="index-' -------------------------------------------------------------------------------- (?! look ahead to see if there is not: -------------------------------------------------------------------------------- [12] any character of: '1', '2' -------------------------------------------------------------------------------- _ '_' -------------------------------------------------------------------------------- ) end of look-ahead -------------------------------------------------------------------------------- ( group and capture to : -------------------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of -------------------------------------------------------------------------------- _ '_' -------------------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- \. '.' -------------------------------------------------------------------------------- (?: group, but do not capture: -------------------------------------------------------------------------------- jpg 'jpg' -------------------------------------------------------------------------------- | OR -------------------------------------------------------------------------------- png 'png' -------------------------------------------------------------------------------- ) end of grouping -------------------------------------------------------------------------------- " '"' -------------------------------------------------------------------------------- \/ '/' -------------------------------------------------------------------------------- ><br> '><br>' -------------------------------------------------------------------------------- $ before an optional \n, and the end of the string

您可以使用

而不是使用负前瞻(?!2|1)
(?![12]_)

如果下一个字符是 1 或 2 后跟下划线,它会阻止匹配。

通过摆弄 here,我想我得到了你要找的东西:

import re

txt = "index-4_8.jpg"
txt2 = "index-1_8.png"

#Check if the string starts with "The":

x = re.search("^(index-2_|index-1_).+(.jpg|.png)$", txt)

if (x):
    print('Matched')
else:
    print('NotMatched')

x = re.search("^(index-2_|index-1_).+(.jpg|.png)$", txt2)

if (x):
    print('Matched')
else:
    print('NotMatched')