簡體   English   中英

Python:正則表達式刪除超過N個連續字母

[英]Python:Regex to remove more than N consecutive letters

假設我有這個字符串:Sayy Hellooooooo

如果 N = 2

我希望結果是(使用正則表達式):Sayy Hello

提前謝謝你

您可以為給定的n動態構建正則表達式,然后在沒有回調的情況下調用sub

import re

n = 2
regex = re.compile(rf"((.)\2{{{n-1}}})\2+")

s = "Sayy Hellooooooo"
print(regex.sub(r"\1", s))  # Sayy Helloo

解釋:

  • {{ :這個雙括號表示 f 字符串中的文字括號
  • {n-1}注入n-1 -1 的值,因此與額外的(雙)大括號包裝一起,這個{{{n-1}}} } 在n為 3 時產生{2}
  • 外部捕獲組捕獲一個字符的最大允許重復次數
  • 額外的\2+捕獲相同字符的更多后續出現,因此這些是需要刪除的字符。
  • 因此,用\1替換會重現允許的重復,但會忽略同一字符的額外重復。

另一種選擇是將re.sub與回調一起使用:

N = 2

result = re.sub(r'(.)\1+', lambda m: m.group(0)[:N], your_string)

您可以使用反向引用來匹配前一個字符。 所以(a|b)\1會匹配aabb 在您的情況下,您可能需要任何字母和任意數量的重復,因此([a-zA-Z])\1{n,}重復 N 次。 然后再次使用\1將其替換為一次。 所以把它們放在一起:

import re

n=2

expression = r"([a-zA-Z])\1{"+str(n)+",}"
print(re.sub(expression,r"\1","hellooooo friiiiiend"))
# Outputs Hello friend

在線嘗試!

請注意,這實際上只匹配 N+1 次重復,就像您的測試用例一樣。 一個項目然后它的 N 個副本。 如果你想精確匹配 N 也減去 1。

請記住在正則表達式前使用r ,這樣您就不需要雙重轉義反斜杠。

了解有關反向引用的更多信息: https://www.regular-expressions.info/backref.html了解有關重復的更多信息: https://www.regular-expressions.info/repeat.html

您需要一個正則表達式來搜索同一字符的多次出現,這是用(.)\1完成的( \1匹配組 1(在括號中))

匹配

  • 出現 2 次: (.)\1
  • 出現 3 次: (.)\1\1(.)\1{2}
  • 出現 4 次: (.)\1\1\1(.)\1{3}

所以你可以用一個 f-string 和你想要的值來構建它(這有點難看,因為你有需要使用雙括號轉義的文字括號,並且在括號內允許值本身)

def remove_letters(value: str, count: int):
    return re.sub(rf"(.)\1{{{count}}}", "", value)


print(remove_letters("Sayy Hellooooooo", 1))  # Sa Heo
print(remove_letters("Sayy Hellooooooo", 2))  # Sayy Hello
print(remove_letters("Sayy Hellooooooo", 3))  # Sayy Hellooo

您可能會更容易理解模式創建

r"(.)\1{" + str(count) + "}"

這似乎有效:

  • N=2時:正則表達式模式被編譯為: ((\w)\2{2,})
  • N=3時:正則表達式模式被編譯為: ((\w)\2{3,})

代碼:

import re
N = 2
p = re.compile(r"((\w)\2{" + str(N) + r",})")

text = "Sayy Hellooooooo"
matches = p.findall(text)

for match in matches:
    text = re.sub(match[0], match[1]*N, text)

print(text)

Output:

Sayy Helloo

筆記:

還測試了N=3N=4和其他文本輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM