【问题标题】:Python Regex to capture from txt filePython 正则表达式从 txt 文件中捕获
【发布时间】:2021-01-29 07:24:27
【问题描述】:

我想编写一个正则表达式,仅当字符串由两个大写字母(状态缩写)和约束组成时才匹配字符串。

txt文件有以下部分值:

VARS 
WA : 1 2 3 4 5 
ID : 1 2 3 4 5 
OR : 1 2 3 4 5 
NV : 1 2 3 4 5 
CA : 1 2 3 4 5 
ENDVARS 
CONSTRAINTS 
!= WA OR 
!= WA ID 
!= CA OR 
!= MA RI 
!= MA CT 
!= CT RI 
ENDCONSTRAINTS

我被困在([A-Z]+) 并且备忘单没有帮助。我正在尝试获得两套: 设置 1:捕获(不包括单词 VARS 和 ENDVARS)\

 WA : 1 2 3 4 5
 ID : 1 2 3 4 5
 OR : 1 2 3 4 5
 NV : 1 2 3 4 5
 CA : 1 2 3 4 5

第 2 组:捕获(不包括 CONSTRAINTS 和 ENDCONSTRAINTS)\

 != WA OR 
 != WA ID 
 != CA OR 
 != MA RI 
 != MA CT 
 != CT RI

我认为添加 {2} 将意味着仅捕获 2 个字符,对于第一个集合,但不起作用。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    看起来这两个适用于您的输入文件。

    第 1 部分

    两个大写,一个空格,一个冒号,空格和数字的重复

    [A-Z]{2} :[ 0-9]+
    

    匹配:

    WA : 1 2 3 4 5 
    ID : 1 2 3 4 5 
    OR : 1 2 3 4 5 
    NV : 1 2 3 4 5 
    CA : 1 2 3 4 5 
    

    Demo

    第 2 部分

    感叹号、等号、空格、空格和大写字母的重复

    != [ A-Z]+
    

    匹配:

    != WA OR 
    != WA ID 
    != CA OR 
    != MA RI 
    != MA CT 
    != CT RI 
    

    Demo

    【讨论】:

    • 谢谢。愚蠢的我,我忘记了空格,难怪我最初只捕获字母字符。
    【解决方案2】:
    import re
    
    txt = '''\
    VARS 
    WA : 1 2 3 4 5 
    ID : 1 2 3 4 5 
    OR : 1 2 3 4 5 
    NV : 1 2 3 4 5 
    CA : 1 2 3 4 5 
    ENDVARS 
    CONSTRAINTS 
    != WA OR 
    != WA ID 
    != CA OR 
    != MA RI 
    != MA CT 
    != CT RI 
    ENDCONSTRAINTS
    '''
    
    print([m for m, _ in re.findall(r"([A-Z]{2}\s:\s(\d\s)+)", txt, flags=re.MULTILINE)])
    # ['WA : 1 2 3 4 5 ',
    #  'ID : 1 2 3 4 5 ',
    #  'OR : 1 2 3 4 5 ',
    #  'NV : 1 2 3 4 5 ',
    #  'CA : 1 2 3 4 5 ']
    print([m for m, _ in re.findall(r"(!=\s([A-Z]{2}\s)+)", txt, flags=re.MULTILINE)])
    # ['!= WA OR ', '!= WA ID ', '!= CA OR ', '!= MA RI ', '!= MA CT ', '!= CT RI ']
    

    这是你要找的吗?

    【讨论】:

    • 谢谢你,我想从如何捕捉我需要的东西开始,我即将得到你刚才建议的东西。我最终将进行回溯搜索和颜色映射。看起来这更近了一步。谢谢
    【解决方案3】:

    你可以把问题分成两组模式。第一个查找起始变量并以数字结尾,第二个跳过第一个值并以字母结尾。

    import re
    
    pattern_1 = r'^[A-Z]{2}(?=\s).*\d'
    pattern_2 = r'^.{1,2}\s[A-Z]{2}\s\w*'
    
    data = """
    VARS 
    WA : 1 2 3 4 5 
    ID : 1 2 3 4 5 
    OR : 1 2 3 4 5 
    NV : 1 2 3 4 5 
    CA : 1 2 3 4 5 
    ENDVARS 
    CONSTRAINTS 
    != WA OR 
    != WA ID 
    != CA OR 
    != MA RI 
    != MA CT 
    != CT RI 
    ENDCONSTRAINTS
    """
    
    group_1 = re.findall(pattern_1, data, re.MULTILINE)
    print(group_1)
    >>> [
      'WA : 1 2 3 4 5', 
      'ID : 1 2 3 4 5', 
      'OR : 1 2 3 4 5', 
      'NV : 1 2 3 4 5', 
      'CA : 1 2 3 4 5'
    ]
    
    group_2 = re.findall(pattern_2, data, re.MULTILINE)
    print(group_2)
    >>> [
      '!= WA OR', 
      '!= WA ID', 
      '!= CA OR', 
      '!= MA RI', 
      '!= MA CT', 
      '!= CT RI'
    ]
    

    【讨论】:

      【解决方案4】:

      您需要为正则表达式添加边界条件。

      您已经知道它是[A-Z]{2},但您还想确保单词是开始和结束的,并且之后有一个空格。为此,您可以使用\b[A-Z]{2}\b 。您可以在reg101 链接中查看此内容。

      首先,我试图找出下一组数据将用于哪个集合。如果该集合具有 VAR,则设置 VAR 的标志。如果数据以 CON 开头,则设置 CON 标志。假设以下行将成为 VAR 或 CON 集的一部分。

      import re
      var = "VAR"
      var_set = []
      con = "CONSTRAINTS"
      con_set = []
      with open('abc.txt') as input_data:
          for line in input_data:
              line = line.strip()
              z = re.findall(r"\b[A-Z]{2}\b ",line)
      
              if not z:
                  if   var in line: found = var
                  elif con in line: found = con
                  else: found = '' 
      
              if z:
                  if found == var:
                      var_set.append(line)
                  elif found == con:
                      con_set.append(line)
      
      print ('var set')
      for v in var_set: print (v)
      print ('con set')
      for c in con_set: print (c)
      

      这个输出将是:

      var set
      WA : 1 2 3 4 5
      ID : 1 2 3 4 5
      OR : 1 2 3 4 5
      NV : 1 2 3 4 5
      CA : 1 2 3 4 5
      con set
      != WA OR
      != WA ID
      != CA OR
      != MA RI
      != MA CT
      != CT RI
      

      您可能也有兴趣查看我为类似情况所做的示例。查看堆栈溢出解决方案:Extract line from txt file using python

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2014-01-02
        • 2012-09-25
        相关资源
        最近更新 更多