匹配模式排除字符



我有以下情况。字符" "用作分隔符,但有一些意外的";"在像value;2va;ue4这样的值中:

...;01;value1;02;valu;2;03;value3;04;va;ue4;....

与模式dd;.{6};它返回所有块,但我想知道通过循环每个块并返回True/False如果;{6},这样我将得到2个列表:

1。;{6}

2。{6}

的值不仅是字母数字,它可以接受额外的字符(* $ |),但;

我尝试添加[^;]但是没有成功

我该怎么办?

谢谢

您可以将不包含;的捕获组匹配到一个捕获组,将包含;的捕获组匹配到另一个捕获组。然后,您可以检查捕获的组值,以查看实际匹配的值。

dd;(?:([^;s]{6});|(S{6});)

参见regex演示。在这里,value1value3在组1中,因此在这些值中不存在;valu;2va;ue4在Group 2中,所以它们包含一个;(因为有一个匹配,而第一个组不匹配,除了;支持外,它们的组模式是相同的)。

参见Python演示:

import re
rx = r'dd;(?:([^;s]{6};)|(S{6};))'
myString = ';01;value1;02;valu;2;03;value3;04;va;ue4;' 
matches = re.findall(rx, myString)
# => [('value1;', ''), ('', 'valu;2;'), ('value3;', ''), ('', 'va;ue4;')]
list1 = [x for x,y in matches if x]
# => ['value1;', 'value3;']
list2 = [y for x,y in matches if y]
# => ['valu;2;', 'va;ue4;']

值没有,可以通过表达式:dd;[^;]{6}

;可以通过表达式:dd;(?=[^;]{0,5};).{6}

第四只鸟的响应来解决,我将使用第二个模式并循环遍历第一个模式中找到的块列表,如下所示:

myString = ';01;value1;02;valu;2;03;value3;04;va;ue4;' 
pattern1 = re.compile(r'dd;.{6};')
listOfBlocks = pattern1.findall(myString) 
pattern2 = re.compile(r'dd;[^;]{6};')
for block in listOfBlocks : 
if bool(re.search(pattern2, block )) is True :
listeOK.append(block) 
else : 
listeKO.append(block)

最新更新