我試圖解決正則運算式的問題:
有一個輸入句子是以下形式之一:或者Number1,2,3這些是 3 個分隔符:Number1/2/3Number1-2-3, / -
預期的輸出是:Number1,Number2,Number3
到目前為止我嘗試過的模式:
(?\<=,)\[^,\] (?=,)
但這錯過了邊緣情況,即第一個元素和最后一個元素。我也無法為“/”生成。
uj5u.com熱心網友回復:
您可以將鍵與值分開,然后使用串列推導來構建您想要的輸出。
inp = "Number1,2,3"
matches = re.search(r'(\D )(.*)', inp)
output = [matches[1] x for x in re.split(r'[,/]', matches[2])]
print(output) # ['Number1', 'Number2', 'Number3']
uj5u.com熱心網友回復:
您可以通過幾個步驟來完成:1)驗證字串以匹配您的模式,并在驗證后 2)將第一個非數字塊添加到數字中,同時用逗號替換-和分隔字符:/
import re
texts = ['Number1,2,3', 'Number1/2/3', 'Number1-2-3']
for text in texts:
m = re.search(r'^(\D )(\d (?=([,/-]))(?:\3\d )*)$', text)
if m:
print( re.sub(r'(?<=,)(?=\d)', m.group(1).replace('\\', '\\\\'), text.replace('/',',').replace('-',',')) )
else:
print(f"NO MATCH in '{text}'")
請參閱此 Python 演示。
輸出:
Number1,Number2,Number3
Number1,Number2,Number3
Number1,Number2,Number3
正^(\D )(\d (?=([,/-]))(?:\3\d )*)$則運算式驗證您的三種型別的輸入:
^- 字串的開始(\D )- 第 1 組:一個或多個非數字(\d (?=([,/-]))(?:\3\d )*)- 第 2 組:一個或多個數字,然后是,,/or-和一個或多個數字的零個或多個重復(并且分隔符應該是一致的,因為正向前瞻中使用的捕獲和\3對非中使用的該值的反向參考-捕獲組)$- 字串結束。
re.sub模式 ,(?<=,)(?=\d)匹配逗號和數字之間的位置,Group 1 值被放置在那里(注意是.replace('\\', '\\\\')必要的,因為替換是動態的)。
uj5u.com熱心網友回復:
import re
for text in ("Number1,2,3", "Number1-2-3", "Number1/2/3"):
print(re.sub(r"(\D )(\d )[/,-](\d )[/,-](\d )", r"\1\2,\1\3,\1\4", text))
\D匹配“數字”或任何其他非數字文本\d匹配一個數字(或多個)[/,-]匹配任何/,,,-
剩下的就是復制粘貼3次。
替換包括對匹配的“數字”字串 ( \1) 的反向參考,然后是每個(\d )s 組。
如果您確定它始終是三個數字除以該分隔符,則此方法有效。這并不能確保每個數字之間的分隔符相同。但它很短。
輸出:
Number1,Number2,Number3
Number1,Number2,Number3
Number1,Number2,Number3
uj5u.com熱心網友回復:
如果您可以使用pypi 正則運算式模塊,則可以將 captures 集合與命名的捕獲組一起使用。
([^\d\s,/] )(?<num>\d )([,/-])(?<num>\d )(?:\3(?<num>\d ))*(?!\S)
([^\d\s,/] )捕獲組 1,匹配 1 字符以外的列出(?<num>\d )匹配 1 個以上數字的命名捕獲組編號([,/-]),/-在第 3 組中捕獲任一(?<num>\d )匹配 1 個以上數字的命名捕獲組編號(?:\3(?<num>\d ))*可選擇重復對第 3 組的反向參考以保持分隔符相同并匹配第num組中的 1 位(?!\S)斷言右邊的空白邊界以防止部分匹配
正則運算式演示| Python 演示
import regex as re
pattern = r"([^\d\s,/] )(?<num>\d )([,/-])(?<num>\d )(?:\3(?<num>\d ))*(?!\S)"
s = "Number1,2,3 or Number4/5/6 but not Number7/8,9"
matches = re.finditer(pattern, s)
for _, m in enumerate(matches, start=1):
print(','.join([m.group(1) c for c in m.captures("num")]))
輸出
Number1,Number2,Number3
Number4,Number5,Number6
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457105.html
上一篇:雪花正則運算式
