Python中模式匹配和替换的更好方法是什么?

2024-04-20 08:35:35 发布

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

我有一个有术语和句子的平面文件。如果在句子中发现任何术语,我需要加上| present(术语| present)。基本上,模式匹配(不区分大小写)和append | present。此外,我们需要保留与句子中相同的情况。什么方法在Python中是可行的和更快的。我用Oracle regex试过了,这需要几天来处理70k条记录。你知道吗

现在我正在使用下面的代码。有没有更好的办法。而且在当前的方法中,它可以很好地处理50条记录,但是当运行整个70k条记录时,df['words']是空的。不知道原因是什么。你知道吗

from pandas import DataFrame

df = {'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
        'sentence': ['Ford is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
        }
from pandas import DataFrame
import re
df = DataFrame(df,columns= ['term','sentence'])

pattern = "|".join(f"\w*(?<![A-Za-z-;:,/|]){i}\\b" for i in df["term"])

df["words"]= df['sentence'].str.findall(pattern, flags=re.IGNORECASE)

def replace_values(row):
    if len(row.words)>0:
        pat = r"(\b"+"|".join(row.words) +r")(\b)"
        row.sentence = re.sub(pat, "\\1|present\\2", row.sentence)
    return row

df = df.apply(replace_values, axis=1)



Tags: 方法importredataframedfis记录sentence
1条回答
网友
1楼 · 发布于 2024-04-20 08:35:35

你的模式是非常低效的,因为它有许多未编排的替代方案,从一个相同的模式开始,可以回溯很多。此外,要使用的词边界还需要按长度降序对术语进行排序,以便在重叠的情况下找到最长的术语(例如,MercededMercedes Benz)。你知道吗

所以,使用

pattern = r'(?i)\b(?:{})\b'.format('|'.join(sorted(df["term"],key=len,reverse=True)))

或者,如果你在条款中有特殊的角色

pattern = r'(?i)(?<!\w)(?:{})(?!\w)'.format('|'.join(map(re.escape, sorted(df["term"],key=len,reverse=True))))

然后呢

df["words"]= df["sentence"].str.findall(pattern)
df["sentence"].replace(pattern, r"\g<0>|present", inplace=True, regex=True)

模式将看起来像(?i)\b(?:Mercedes Benz|EXpensive|electric|TOYOTA|Ford|cars)\b,它将匹配-由于(?i)-整个单词Mercedes BenzEXpensiveelectricTOYOTAFordcars而不区分大小写,并且在df["sentence"].str.findall(pattern)中,它将找到模式匹配的所有不重叠的出现,并且在df["sentence"].replace(pattern, r"\g<0>|present", inplace=True, regex=True),所有匹配都将被自身替换(\g<0>是一个反向引用对整个匹配)+|present附加到它们。你知道吗

相关问题 更多 >