【问题标题】:Regex for capturing digits in a string (Python)用于捕获字符串中的数字的正则表达式(Python)
【发布时间】:2019-09-29 09:46:32
【问题描述】:

我是 python 新手,我正在使用正则表达式处理一个文本文件以提取 id 并附加一个列表。我在下面写了一些python,打算构造一个看起来像这样的列表

["10073710","10074302","10079203","10082213"...and so on]

相反,我看到了一个包含一堆详细标签的列表结构。我假设这是正常行为,并且 finditer 函数在找到匹配项时会附加这些标签。但是响应有点混乱,我不确定如何关闭/删除这些添加的标签。请参阅下面的屏幕截图。

谁能帮我修改下面的代码,以便我可以实现列表的预期结构?

import re

#create a list of strings
company_id = []

#open file contents into a variable
company_data = open(r'C:\Users\etherealessence\Desktop\company_data_test.json', 'r', encoding="utf-8")

#read the line structure into a variable
line_list = company_data.readlines()

#stringify the contents so regex operations can be performed
line_list = str(line_list)

#close the file
company_data.close()

#assign the regex pattern to a variable
pattern = re.compile(r'"id":([^,]+)')

#find all instances of the pattern and append the list
#https://stackoverflow.com/questions/12870178/looping-through-python-regex-matches
for id in re.finditer(pattern, line_list): 
  #print(id)
  company_id.append(id)

#test view the list of company id strings
#print(line_list)
print(company_id)

【问题讨论】:

  • Regex 在这里是一个糟糕的解决方案。你可能想要像 JSON Path 这样的东西来直接查询结构。

标签: python regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

re.finditer 返回 iteratorre.Match 对象。

如果您想提取实际匹配(更具体地说,是捕获的组,以摆脱领先的"id":),您可以执行以下操作:

for match in re.finditer(pattern, line_list):
    company_id.append(match.group(1))

【讨论】:

    【解决方案2】:

    如果您的数据是 JSON 格式,您可能只想简单地解析它。


    如果您希望使用正则表达式,您可以简化表达式并使用三个捕获组来更轻松地获取所需的 ID。你可以在你的ID左右设置两个捕获组,然后中间的捕获组可以帮你获取ID,可能类似于this expression

    ("id":")([0-9]+)(") 
    

    正则表达式描述图

    这个link 可以帮助你可视化你的表情:

    Python 测试

    # coding=utf8
    # the above tag defines encoding for this document and is for Python 2.x compatibility
    
    import re
    
    regex = r"(\x22id\x22:\x22)([0-9]+)(\x22)"
    
    test_str = "some other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON data"
    
    matches = re.finditer(regex, test_str, re.MULTILINE)
    
    for matchNum, match in enumerate(matches, start=1):
    
        print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
    
        for groupNum in range(0, len(match.groups())):
            groupNum = groupNum + 1
    
            print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
    
    # Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
    

    Python 测试

    # -*- coding: UTF-8 -*-
    import re
    
    string = "some other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON datasome other JSON data'\"id\":\"10480132\"'>some other JSON data"
    expression = r'(\x22id\x22:\x22)([0-9]+)(\x22)'
    match = re.search(expression, string)
    if match:
        print("YAAAY! \"" + match.group(2) + "\" is a match ??? ")
    else: 
        print('? Sorry! No matches!')
    

    输出:

    YAAAY! "10480132" is a match ???
    

    【讨论】:

      【解决方案3】:

      要获取值,请使用id.string

      for id in re.finditer(pattern, line_list): 
        company_id.append(id.string)
      

      当您只读取 id 时,您并没有获取实际值。

      【讨论】:

        猜你喜欢
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 2016-07-26
        • 1970-01-01
        相关资源
        最近更新 更多