regex 从具有重音字符的字符串中删除相邻的重复单词/短语

dwbf0jvd  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(130)

我正在尝试从字符串中删除重复的单词/短语。
例如,如果我有下面的字符串
“normalement ononon va,on vadiviser,génériquegénériquegénérique l'explication,générique l'explicationdetaille,detaille
我想删除重复的短语“on va”之后,和“générique l 'explication”之后,在上面的字符串中,也重复连续的单个单词“on”和“générique”。尝试了下面两种方法,但似乎它是工作时,它将没有任何标点符号的单个单词

>>> import re
>>> s = "normalement on on on va, on va diviser, générique générique l'explication, générique l'explication détaille, détaille"
>>> re.sub(r'\b(.+)(\s+\1\b)+', r'\1', s)
"normalement on va, on va diviser, générique l'explication, générique l'explication détaille, détaille"

>>> sen="normalement on on on va, on va diviser, générique générique l'explication, générique l'explication détaille, détaille"
>>> re.sub(r"\b([a-zA-z àâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+\s *)\1{1,}", '\\1', sen, flags=re.IGNORECASE)
"normalement on va, on va diviser, générique l'explication, générique l'explication détaille, détaille"

有没有人可以帮助我在这方面和建议,我如何可以删除相邻的重复单词/短语出现标点符号和没有标点符号。

e3bfsja2

e3bfsja21#

re.sub(r"\b(\w+(\s\w+)?)\b(?:.*?)(\b\1\b)", "\\1", sen, flags=re.IGNORECASE)
这应该是你想要的。和你分享的那个字符串匹配。

更新:

(@Markalex的有益评论之后。)
前面的正则表达式将捕获任何重复项,即使它们与被检查的字符串完全相反。这是一个更新的版本。

re.sub(r"(\b[a-zA-zàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+(?:\s[a-zAzàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+)?\b)(?:\W*)(\b\1\b)", "\\1", sen, flags=re.IGNORECASE)

说明:

(                                             #Begin 1st Capture Group
 \b                                           #Word Boundary
  [a-zA-zàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+  #Any of the characters you want, repeated
  (?:                                         #Begin Non-Capture Group, for additional word
   \s                                         #Whitespace
   [a-zA-zàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+ #Any of the characters you want, repeated
  )?                                          #End Non-Capture Group, Allow 0 or 1
 \b                                           #Word Boundary
)                                             #End 1st Capture Group

(?:                                           #Begin Non-Capture Group
 \W*                                          #Match any number of non-alphanumeric characters
)                                             #End Non-Capture Group

(                                             #Begin 2nd Capture Group
 \b                                           #Word Boundary
  \1                                          #Match 1st Capture Group
 \b                                           #Word Boundary
)                                             #End 2nd Capture Group
o4hqfura

o4hqfura2#

您可以使用以下模式,并使用 re.finditer 函数。
随后,您需要检查匹配是否包含逗号,其中您需要使用单独的 str.replace 语句。
我想不出一种方法来捕捉逗号。

([^ ]+ [^ ]+|[^ ]+),? \1
string = 'normalement on on on va, on va diviser, générique générique générique l''explication, générique l''explication détaille, détaille'
for match in re.finditer(r'([^ ]+ [^ ]+|[^ ]+),? \1', string):
    if ',' in match.group():
        string = string.replace(match.group(), match.group(1) + ',')
    else:
        string = string.replace(match.group(), match.group(1))

输出量

normalement on on va, diviser, générique générique lexplication, détaille,

相关问题