[英]Getting pattern matched from match object
我正在使用 Python 正則表達式,我正在嘗試從匹配項 object 中獲取模式匹配,而不是文本匹配本身。
我有一些模式要替換,我正在這樣做:
import re
patterns = {
r'^[ |\n]+': '',
r'[ |\n]+$': '',
r'[ |\n]+': ' '
}
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join(patterns.keys()),
lambda match: patterns[ match.group(0) ],
text)
但這是一個錯誤的解決方案,因為match.group(0)
返回匹配的文本,因此它們都不等於模式字典的任何鍵。
我嘗試match.pattern
但出現異常並嘗試match.re
但這給出了所有re.compile
object 並且其針對此問題的模式是'^[ |\n]+|[ |\n]+$|[ |\n]+'
。
編輯:基於 Barmar 解決方案我得到了這個:
import re
patterns = [
(r'^[ |\n]+', ''),
(r'[ |\n]+$', ''),
(r'[ |\n]+', ' ')
]
def getreplacement(match):
for i, group in enumerate(match.groups()):
if group:
return patterns[ i ][ 1 ]
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join('(' + p[ 0 ] + ')' for p in patterns), getreplacement, text)
print(text)
但仍然不是總能從匹配組中獲取模式的方法。
我認為沒有辦法直接找出匹配的替代方案。
使用列表而不是字典,並將每個模式放在捕獲組中。 然后您可以查看匹配的捕獲組,並將其用作索引以獲取相應的替換。
請注意,如果模式中有任何捕獲組,這將不起作用。 如果需要組,請確保它們不是捕獲的。
import re
patterns = [
(r'^[ |\n]+', ''),
(r'[ |\n]+$', ''),
(r'[ |\n]+', ' ')
]
def getreplacement(match):
for i in range(1, match.groups):
if match.group(i):
return patterns[i-1][1]
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join('(' + p[0] + ')' for p in patterns), getreplacement, text)
如果我做對了,你想要去除前導和尾隨空格並將中間的空格減少到一個。
首先,您的代碼可能有一個錯誤: [ |\n]
將匹配一個空格 (
)、pipe ( |
) 或換行。 您可能不想匹配 pipe,但您可能想要匹配所有空白字符,例如制表符 ( \t
)。
其次,樣式:保持你的行在 80 個字符以下,並且括號中的索引周圍沒有空格。
第三,刪除前導和尾隨空格只需使用str.strip
。 現在唯一需要替換的是兩個或更多空格的序列,這很容易與\s{2,}
( \s
= “whitespace”, {2,}
= “兩個或更多”)匹配。
這是您的代碼的修改:
import re
patterns = [
(r"^[ |\n]+", ""),
(r"[ |\n]+$", ""),
(r"[ |\n]+", " "),
]
def get_replacement(m: re.Match) -> str:
return next(
patterns[i][1]
for i, group in enumerate(m.groups())
if group is not None
)
text = (
"\n"
" \t Hello there, I\n need your help here plase :) \t \n"
" \t Hello there, I\n need your help here plase :) \t "
"\n"
)
result1 = re.sub(
"|".join(f"({p})" for p, _ in patterns),
get_replacement,
text,
)
result2 = re.sub(r"[ \n]{2,}", " ", text.strip())
result3 = re.sub(r"\s{2,}", " ", text.strip())
print(repr(result1))
print(repr(result2))
print(repr(result3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.