我有以下情况。字符" "用作分隔符,但有一些意外的";"在像value;2或va;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演示。在这里,value1
和value3
在组1中,因此在这些值中不存在;
。valu;2
和va;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)