簡體   English   中英

Python展望正則表達式

[英]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']

簡要說明:

  • (?= [AD]。| $)-向前看'A.' “ B.”等或行尾($)
  • 。+? -前瞻符號之前的所有符號都匹配,但不是貪婪(?)。 這意味着它將在第一場比賽之前找到,直到最后一場比賽為止。

您可以嘗試以下方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM