Skip to main content
 首页 » 编程设计

"\*"(文字星号字符)或 "\s"(空格)之间的 Python Regex 匹配选择

2025年05月04日9sky-heaven

我正在尝试匹配“D”行并捕获字符 类似数据集中的 2、3、4 和 5 以:

S    7....                        <- line 1 
         associated random data   <- line 2 
D*EX 0....                        <- line 3 
         associated random data   <- line 4 
C    0....                        <- line 5 
         associated random data   <- line 6 
D E  6....                        <- line 7 
         associated random data   <- line 8 
         associated random data   <- line 9 
D    3....                        <- line 10 
         associated random data   <- line 11 
D O  3....                        <- line 12 
         associated random data   <- line 13 
         associated random data   <- line 14 

即我不想只是捕获^D。*“EX”字符可能会改变,我稍后需要区分它们。

我遇到的问题似乎是在第二个字符(列)中选择“*”和“”(空格)。

但是,在“*”和“\s”之间指定一个选项似乎与“D*EX 0....”行不匹配

re.compile(r'''^(^[D]               # Match "D" 
                [\*|\s]         <-- # Match either "*" or " " 
                [A-Z{1,2}\s|\s{3}]  # match either "EX" + "" OR match 3x" " 
.*?)^[A-Z]''', re.DOTALL | re.MULTILINE |re.VERBOSE)  # match anything else if there... 

匹配和输出 => D EX 6.... 和 D 3....

如果我隐式指定“*”,我确实以行匹配结束,但当然不会匹配额外的行。

re.compile(r'''^(^[D]               # Match "D" 
                [\*]            <-- # Match ONLY "*" 
                [A-Z{1,2}\s|\s{3}]  # match either "EX" + "" OR match 3x" " 
.*?)^[A-Z]''', re.DOTALL | re.MULTILINE |re.VERBOSE)  # match anything else if there... 

仅匹配和输出 => D*EX 0....

有人建议我尝试使用非捕获组,虽然 NC 组是新的但对我来说有点意义,但我可能仍然希望捕获的输出和 NC 组的原始选择是“* "和 "\s",仍然不匹配。我玩过许多组合,但输出与以下一致。

re.compile(r'''^(^[D]               # Match "D" 
                (?:[\*|\s]      <-- # non-capturing group match either "*" or " " 
                [A-Z{1,2}\s|\s{3}]  # match either "EX" + "" OR match 3x" " 
.*?)^[A-Z]''', re.DOTALL | re.MULTILINE |re.VERBOSE)  # match anything else if there... 

匹配和输出 => D EX 0.... 和 D 0....

任何建议/建议都将受到赞赏;我在这里兜圈子:O

请您参考如下方法:

这是设置:

import re 
 
txt = '''S    7....                        <- line 1 
         associated random data   <- line 2 
D*EX 0....                        <- line 3 
         associated random data   <- line 4 
C    0....                        <- line 5 
         associated random data   <- line 6 
D E  6....                        <- line 7 
         associated random data   <- line 8 
         associated random data   <- line 9 
D    3....                        <- line 10 
         associated random data   <- line 11 
D O  3....                        <- line 12 
         associated random data   <- line 13 
         associated random data   <- line 14''' 
 
flags = re.DOTALL | re.MULTILINE |re.VERBOSE 

下面是一些示例用法:

re1 = re.compile('''^(D.*?)\d''', flags)     
print re.findall(re1, txt) 

返回:

['D*EX ', 'D E  ', 'D    ', 'D O  '] 

我意识到你可能想要所有相关的随机数据,如果你想要所有这些中间的东西都是无关紧要的,重要的是最后的部分:

消除多行标志

flags = re.DOTALL | re.VERBOSE 

现在从每个新行的开头开始,寻找紧随其后的 D,并以非贪婪的方式将其和之后的所有内容捕获到带有另一个字符或字符串末尾的换行符的书尾。

re1 = re.compile( 
  r'''(?:^|\n) # noncapturing, assert start of string or newline 
      (D.*?)   # capture D and everything after it 
      (?=\n[A-Z]|$) #lookahead, newline cap char or end of string? 
  ''', flags) 
 
 
for i in  re.findall(re1, txt): 
    print i 

打印:

D*EX 0....                        <- line 3 
         associated random data   <- line 4 
D E  6....                        <- line 7 
         associated random data   <- line 8 
         associated random data   <- line 9 
D    3....                        <- line 10 
         associated random data   <- line 11 
D O  3....                        <- line 12 
         associated random data   <- line 13 
         associated random data   <- line 14 

这就是您要找的。

后记

作为后记,在放弃之前,我使用多行代码进入了兔子洞。也许您可以看出自己做错了什么。

^((D[\*\s]([A-Z]\s{2}|[A-Z]{2}\s|\s{3}).*)$(?!^\n[A-Z])) 

首先,不要在方括号内使用竖线,除非您确实希望它们成为可能。