Python正则表达式修复多种类型的编码数据

2024-10-02 02:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从一个网站上抓取数据,并试图从网站上的数据创建一个表。然而,网页可能有多种结构,因此我有这样做的困难

到目前为止,我遇到的两种不同类型的结构是:

text1 = ['\nPie\n    Type\n\xa0\nMain\n    Ingrediënt\n\xa0\nCountry\n    of Origin', '\nApplie\n    Pie\n\xa0\nApples\n\xa0\nUnited\n    Kingdom']

text2 = ['\n\nPie Type\n\n\nMain Ingrediënt\n\n\nCountry of Origin\n\n', '\n\nApple Pie\n\n\nApples\n\n\nUnited Kingdom\n\n']

到目前为止,使用以下代码:

for x in range(len(text1)):
try:
    y = text1[x].strip().split('\xa0')
    tlist = []
    for p in y:
        lst = p.replace('\n    ', ' ').replace('\n', '')
        tlist.append(lst)
    dflist.append(tlist)
except:
    dflist.append('X')

text1将返回以下输出:

[['Pie Type', 'Main Ingrediënt', 'Country of Origin'], ['Applie Pie', 'Apples', 'United Kingdom']]

这也是我希望文本2返回的内容。但在text2上使用相同的代码将返回:

[['Pie TypeMain IngrediëntCountry of Origin'], ['Apple PieApplesUnited Kingdom']]

因为它包含\n\n\n而不是\n\xa0\n

我曾尝试使用if语句来确定数据是否包含这两个语句中的任何一个,但如果使用if '\xa0' in text1:,这似乎不起作用

有谁能帮我用一个正则表达式函数来将这两个函数转换成所需的结构,或者帮我想出另一种方法来解决这个问题

谢谢

编辑: 感谢所有及时回答这个问题的人。不幸的是,你的回答都没有给我提供我想要的结果,但我回答了我自己的问题。如果stackoverflow允许,我将在2天内接受它作为答案,除非我收到另一个有效的答案

编辑: Suneesh Jacob和RJ Adriaansen都为这个问题提供了有效的代码解决方案。我决定对答案计时,并接受最快的答案为最佳答案

结果:

def decode(data):
return [[j.replace('\n    ',' ').strip() for j in re.split(r'\n\n\n|\n\xa0\n',i)] for i in data]

result:
0.07250859999999999

def clean_list(lst):
    lst = [re.split('\n\n\n|\n\xa0\n',i) for i in lst]
    return [[' '.join(i.split()) for i in sublist] for sublist in lst]

result:
0.0712564

谢谢大家!


Tags: of数据答案infortypeorigin结构
3条回答

在您的情况下不需要正则表达式,只需执行此操作并在拆分之前添加替换即可

 y = text1[x].strip().replace("\n\n\n",'\n\xa0\n').split('\xa0')

而不是

y = text1[x].strip().split('\xa0')

使用正则表达式,可以指定多个分隔符:

import re

def clean_list(lst):
    lst = [re.split('\n\n\n|\n\xa0\n',i) for i in lst]
    return [[' '.join(i.split()) for i in sublist] for sublist in lst]

print(clean_list(text1), clean_list(text2))

[['Pie Type', 'Main Ingrediënt', 'Country of Origin'], ['Applie Pie', 'Apples', 'United Kingdom']]
[['Pie Type', 'Main Ingrediënt', 'Country of Origin'], ['Apple Pie', 'Apples', 'United Kingdom']]

您可以尝试以下方法:

import re

text1 = ['\nPie\n    Type\n\xa0\nMain\n    Ingrediënt\n\xa0\nCountry\n    of Origin', '\nApplie\n    Pie\n\xa0\nApples\n\xa0\nUnited\n    Kingdom']
text2 = ['\n\nPie Type\n\n\nMain Ingrediënt\n\n\nCountry of Origin\n\n', '\n\nApple Pie\n\n\nApples\n\n\nUnited Kingdom\n\n']

def decode(data):
    return [[j.replace('\n    ',' ').strip() for j in re.split(r'\n\n\n|\n\xa0\n',i)] for i in data]

print(decode(text1))
print(decode(text2))

相关问题 更多 >

    热门问题