[英]Python look ahead regex
s = u'A.anycontentfollowedbyB.anycontentanylengthC.anycontentD.anycontent'
ExpectResult = [u'A.anycontentfollowedby', u'B.anycontentanylength', u'C.anycontent', u'D.anycontent']
我有這樣的unistr。 我需要將這些選項分隔為四個不同的子字符串,這些子字符串以A.,B.,C.,D。(。不是點,這是一個特殊字符)開頭。 如何達到預期的效果? 感謝大家!! ABCD選項來自多項選擇題。 最多四個選項沒有EFGH ...等,但可能只是一兩個選項,例如僅A.或A.,B。
您犯了一些錯誤。
您應該決定-將使用正則表達式組進行讀取還是拆分。 你迷路了。
它是第一個變體-尋找您的特殊圓點。 您應該使用特殊的點,然后使用-普通點,后跟+,這表示您要查找的字符串。
A.(.+)B.(.+)C.(.+)D.(.+) // read groups by that regex
如果您需要這些A.並且也可以找到東西,請使用:
(A..+)(B..+)(C..+)(D..+)
or
u'(A..+)',u'(B..+)',u'(C..+)',u'(D..+)'
,如果您需要這些u'...',
結構。
如果您需要第二種情況(拆分)-拆分中的前瞻是毫無意義的。 拆分子字符串的正則表達式應該簡單得多:
'[A-D].' // use your special dot here
就這些。 確實,我不喜歡第二個變體,因為您不能確定您沒有將aaaB.bbbC.ccc
這一行讀為正確的行。 並且您擁有aaa子字符串而沒有A.
而在第一個變體中,您知道第一組來自A.,第二組-來自B.,依此類推。
您不需要在這里向前看。 “ +”-必須轉義,因為它是特殊符號:
>>> re.findall('[A-Z].\+\d', str)
['A.+4', 'B.+5', 'C.+6', 'D.+7']
並且不要將變量命名為“ str”
更新#1:最好在開始時澄清所有內容。 因此,這是一個新的答案,更加復雜(我首先離開只是為了理解和歷史):
>>> s = u'A.anycontentfollowedbyB.anycontentanylengthC.anycontentD.anycontent'
>>> re.findall('.+?(?=[A-D].|$)',s)
['A.anycontentfollowedby', 'B.anycontentanylength', 'C.anycontent', 'D.anycontent']
簡要說明:
您可以嘗試以下方法:
import re
s = u'A.+4B.+5C.+6D.+7'
data = [i for i in re.findall('.{4}', s)]
輸出:
[u'A\uff0e+4', u'B\uff0e+5', u'C\uff0e+6', u'D\uff0e+7']
首先,請注意'.'
在您的字符串中是單個代碼點。 假設您沒有兩個ascii字符:
s = u'A.+4B.+5C.+6D.+7'
print repr(s)
# u'A\uff0e+4B\uff0e+5C\uff0e+6D\uff0e+7'
在構建模式時,您應該考慮以下幾點:
pattern = ur'[^\d]+.\+\d'
print repr(pattern)
# u'[^\\d]+\uff0e\\+\\d'
此外,您將在前瞻性上分割字符,因此除非使用分組括號,否則該字符將不包括在分割中,但是使用re.split
將字符分隔在結果中。 您最好使用re.findall
:
print re.findall(pattern, s)
# [u'A\uff0e+4', u'B\uff0e+5', u'C\uff0e+6', u'D\uff0e+7']
我敢肯定會有比我在這里編碼更好的選擇,但是它將給您一些解決問題的提示。
您有兩種選擇可獲得理想的結果。 假設您的測試字符串
1)使用re.findall
result = re.findall(r"([a-d].*?\d)", data, re.IGNORECASE)
print(result)
2)通過分割字符串
import re
data = r"A. +4B.+5C.+6D.+7"
result = [x for x in re.split(r"([a-d].*?\d)", data, 0, re.IGNORECASE) if x != '']
print(result)
輸出為['A. +4', 'B.+5', 'C.+6', 'D.+7']
['A. +4', 'B.+5', 'C.+6', 'D.+7']
在repl.it上觀看現場演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.