从模式中提取多个字段的正则表达式

1 投票
4 回答
1425 浏览
提问于 2025-04-28 13:49

我在一个文本文件里有这样的格式:

["kiarix moreno","116224357500406255237","z120gbkosz2oc3ckv23bc10hhwrudlcjy04",1409770337,"com.youtube.www/watch?v\u003dp1JPKLa-Ofc:https","es"]

我需要用正则表达式在Python中提取每个字段。每个字段可以包含任何字符(不仅仅是字母和数字),但是第4个字段是一个很长的数字。请问我该怎么做呢?非常感谢。

补充说明:这个文件里还有其他的HTML元素,所以我不能直接用Python的列表来解析它。

暂无标签

4 个回答

0

我打算把 re(正则表达式)、try/except(异常处理)、ast.literal_eval 和文件结合起来,来读取所有可能的元素。同时,为了避免在多行中出现 [ ] 这种情况,所以用 readline 方法不太合适。

这是我的解决方案:

import re
import ast

# grab all possible lists in the file
found = re.findall(r'\[.*\]', open('yourfile.txt' ,'r').read())

for each in found:
    try:
        for el in ast.literal_eval(each):
            print el
    except SyntaxError:
        pass


kiarix moreno
116224357500406255237
z120gbkosz2oc3ckv23bc10hhwrudlcjy04
1409770337
com.youtube.www/watch?v\u003dp1JPKLa-Ofc:https
es
0

你可以这样做:
1) 打开文件。
2) 使用 getline 来逐行读取内容。
3) 使用 split() 函数把每行用“,”分开,然后根据得到的结果(元组或列表)随意处理。

0
"([^"]*")|(\d+)

你可以试试这个。抓取匹配的内容。看看演示。

http://regex101.com/r/dK1xR4/5

1

下面提供了三种获取数据的不同方法:

>>> TEXT = '["kiarix moreno","116224357500406255237","z120gbkosz2oc3ckv23bc10hhwrudlcjy04",1409770337,"com.youtube.www/watch?v\u003dp1JPKLa-Ofc:https","es"]'
>>> import json, ast, re
>>> json.loads(TEXT)
['kiarix moreno', '116224357500406255237', 'z120gbkosz2oc3ckv23bc10hhwrudlcjy04', 1409770337, 'com.youtube.www/watch?v=p1JPKLa-Ofc:https', 'es']
>>> ast.literal_eval(TEXT)
['kiarix moreno', '116224357500406255237', 'z120gbkosz2oc3ckv23bc10hhwrudlcjy04', 1409770337, 'com.youtube.www/watch?v=p1JPKLa-Ofc:https', 'es']
>>> re.search(r'\["(?P<name>[^"]*)","(?P<number1>[^"]*)","(?P<data>[^"]*)",(?P<number2>\d*),"(?P<website>[^"]*)","(?P<language>[^"]*)"\]', TEXT).groupdict()
{'website': 'com.youtube.www/watch?v=p1JPKLa-Ofc:https', 'number2': '1409770337', 'language': 'es', 'data': 'z120gbkosz2oc3ckv23bc10hhwrudlcjy04', 'number1': '116224357500406255237', 'name': 'kiarix moreno'}
>>> 

特别是,你的正则表达式应该是这样的:r'\["(?P<name>[^"]*)","(?P<number1>[^"]*)","(?P<data>[^"]*)",(?P<number2>\d*),"(?P<website>[^"]*)","(?P<language>[^"]*)"\]'

撰写回答