![](/img/trans.png)
[英]Regex and python to express not matching more than one consecutive characters
[英]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
會匹配aa
或bb
。 在您的情況下,您可能需要任何字母和任意數量的重復,因此([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(在括號中))
匹配
(.)\1
(.)\1\1
或(.)\1{2}
(.)\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)
Sayy Helloo
還測試了N=3
、 N=4
和其他文本輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.