想在不同字符之間添加一個空格。我現在在每個字符之間添加它,而如果字符相同(連續),我想省略它。
import re
string = "CEEEETTEEEEGGGCCBCTTBHHHHHCCEEEEEEEEETTEETT"
space = re.compile(r"(?<!^)(?=[CEHBGITS])(?!$)")
print(space.sub("\1", string))
預期結果是:C EEEE TT EEEE GGG CC B C TT B HHHHH CC EEEEEEEEE TT EE TT
uj5u.com熱心網友回復:
您可以使用
re.sub(r'(?<=(.))(?!\1)(?=.)', ' ', str)
Python 演示 <- \(ツ)/ -> 正則運算式演示
正則運算式具有以下元素。
(?<=(.)) # positive lookbehind asserts that the current string location
# is preceded by a character that is saved to capture group 1
(?!\1) # negative lookahead asserts that the current string
# location is not followed by the content of capture group 1
(?=.) # positive lookahead asserts that current string location
# is followed by a character
當前字串位置可以被認為是連續字符之間的位置。
uj5u.com熱心網友回復:
另一種選擇是使用捕獲組和反向參考匹配連續字符,并在替換中使用由\g<0>空格表示的完整匹配。
為了防止出現前導空格,您可以斷言至少有一個前導字符。
(?<=[CEHBGITS])([CEHBGITS])\1*
在部分情況下,模式匹配:
(?<=正向向后看,斷言當前位置的左邊是什么[CEHBGITS]匹配串列中的 1 個字符
)近距離觀察([CEHBGITS])捕獲組 1,匹配列出的字符中的 1 個\1*可以選擇使用反向參考重復第 1 組中捕獲的內容
請參閱正則運算式演示和Python 演示。
例如
import re
s = "CEEEETTEEEEGGGCCBCTTBHHHHHCCEEEEEEEEETTEETT"
pattern = r"(?<=[CEHBGITS])([CEHBGITS])\1*"
print(re.sub(pattern, " \g<0>", s))
輸出
C EEEE TT EEEE GGG CC B C TT B HHHHH CC EEEEEEEEE TT EE TT
匹配非空白字符的較短版本:
(?<=\S)(\S)\1*
正則運算式演示
uj5u.com熱心網友回復:
您可以使用
re.sub(r'(.)(?=(?!\1).)', r'\1 ', text, flags=re.S)
請參閱正則運算式演示。詳情:
(.)- 捕獲組 1(其值\1通過替換模式的反向參考參考):任何一個字符(?=(?!\1).)- 一個正向前瞻,它需要與當前位置右側緊鄰.第 1 組 ( ) 中的字符不同的任何單個字符 ( ) 。(?!\1)
請參閱Python 演示:
import re
text = "CEEEETTEEEEGGGCCBCTTBHHHHHCCEEEEEEEEETTEETT"
print( re.sub(r'(.)(?=(?!\1).)', r'\1 ', text, flags=re.S) )
# => C EEEE TT EEEE GGG CC B C TT B HHHHH CC EEEEEEEEE TT EE TT
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/426977.html
上一篇:如何在Kotlin中將映射和嵌套映射轉換為字串,反之亦然?
下一篇:洗掉每個重復的子字串,區分大小寫
