gpt4 book ai didi

python - 在 Python 中使用正则表达式对数据进行分组

转载 作者:太空狗 更新时间:2023-10-29 20:39:28 26 4
gpt4 key购买 nike

我有一些这样的原始数据:

Dear   John    Buy   1 of Coke, cost 10 dollars
Ivan Buy 20 of Milk
Dear Tina Buy 10 of Coke, cost 100 dollars
Mary Buy 5 of Milk

数据的规律是:

  • 不是每个人都会以“Dear”开头,但如果有的话,肯定是以cost结尾

  • item不一定都是正常的单词,可以不加限制地写(包括str,num等)

我想对信息进行分组,我尝试使用正则表达式。这是我之前尝试过的:

for line in file.readlines():
match = re.search(r'\s+(?P<name>\w+)\D*(?P<num>\d+)\sof\s(?P<item>\w+)(?:\D+)(?P<costs>\d*)',line)
if match is not None:
print(match.groups())
file.close()

现在输出如下:

('John', '1', 'Coke', '10')
('Ivan', '20', 'Milk', '')
('Tina', '10', 'Coke', '100')
('Mary', '5', 'Milk', '')

上面显示的是我想要的。但是,如果 item被一些奇怪的字符串取代,如 A1~A10 ,一些输出会得到错误的信息:

('Ivan', '20', 'A1', '10')
('Mary', '5', 'A1', '10')

我认为 item field 中的常量格式是它总是以 , 结尾(如果有的话)。但我就是不知道如何利用这个优势。

以为用上面的代码暂时成功了,没想到(?P<item>\w+)必须像 (?P<item>.+) 一样替换.如果我这样做,它会在元组中使用错误的字符串,例如:

('John', '1', 'Coke, cost 10 dollars', '')

如何使用 Python 中的正则表达式将数据读入我想要的格式?

最佳答案

我试过这个正则表达式

^(Dear)?\s*(?P<name>\w*)\D*(?P<num>\d+)\sof\s(?P<drink>\w*)(,\D*(?P<cost>\d+)\D*)?

解释

  1. ^(Dear)?Dear 开头的匹配行如果存在
  2. (?P<name>\w*)用于捕获名称的名称捕获组
  3. \D*匹配任何非数字字符
  4. (?P<num>\d+)命名捕获组以获取 num .
  5. \sof\s匹配字符串 of
  6. (?P<drink>\w*)去拿饮料
  7. (,\D*(?P<cost>\d+)\D*)?这是一个可选的组来获取饮料的成本

>>> reobject = re.compile('^(Dear)?\s*(\w*)[\sa-zA-Z]*(\d+)\s*\w*\s*(\w*)(,[\sa-zA-Z]*(\d+)[\s\w]*)?')

第一个数据片段

>>> data1 = 'Dear   John    Buy   1 of Coke, cost 10 dollars'
>>> match_object = reobject.search(data1)
>>> print (match_object.group('name') , match_object.group('num'), match_object.group('drink'), match_object.group('cost'))
('John', '1', 'Coke', '10')

第二个数据片段

>>> data2 = '       Ivan    Buy  20 of Milk'
>>> match_object = reobject.search(data2)
>>> print (match_object.group('name') , match_object.group('num'), match_object.group('drink'), match_object.group('cost'))
('Ivan', '20', 'Milk', None)

关于python - 在 Python 中使用正则表达式对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34896472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com