[問題] regex問題

看板Python作者 (阿吉amig)時間12年前 (2013/11/26 20:08), 編輯推噓0(004)
留言4則, 3人參與, 最新討論串1/2 (看更多)
手邊有一個regex的問題 不知道是不是跟處理中文有關 pat_en = "<foo<bar/pos>" pat_ch = u"<夫<爸/pos>" 以上兩個對等的例子,一為中文,一為英文 我的目標是要抓出最裡面的那個括號就好 亦即 <bar/pos> <爸/pos> # 英文的部份沒有什麼問題,如下 In [1]: re.search(r"<\w*/\w*>", pat_en).group() Out[1]: '<bar/pos>' # 中文... In [2]: re.search(r"<.*?/\w*>", pat_ch).group() Out[2]: '<夫<爸/pos> 這邊的?不是應該是non-greedy嗎? 理論上不是應該要得到<爸/pos>嗎? 如果有理解上的錯誤,煩請高人指點! # 那我在左括號和右括號中間加一個否定式 In [3]: re.search(r"<.[^<]*?/\w*>", pat_ch).group() Out[3]: '<爸/pos>' 可行 # 同樣的方法也套用在英文上 In [4]: re.search(r"<.[^<]*?/\w*", pat_en).group() Out[4]: '<bar/pos>' 也可行 不過我發現,這邊的?有加沒加,好像差不多 所以修改如下 r"<.[^<]*?/\w*>" --> r"<.[^<]*/\w*>" # 套用修改後的的regex在英文上 In [5]: re.search(r"<.[^<]*/\w*>", pat_en).group() Out[5]: '<bar/pos>' # 套用修改後的regex在中文上 In [6]: re.search(r"<.[^<]*/\w*>", pat_ch).group() Out[6]: '<爸/pos>' 由以上發現,這邊?根本沒有作用 這看起來不像是中文編碼問題 即便我在在flag加上re.UNICODE 也沒有任何幫助 如下 In [7]: re.serach(r"<.*?/\w*>", pat_ch, re.UNICODE).group() Out[7]: '<夫<爸/pos>' 請教大大們 怎樣的regex才能比較精確的表達呢? 還有我哪邊的理解錯誤了,請迷津指點一下 卡關卡好久了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.198 ※ 編輯: amigcamel 來自: 140.112.4.198 (11/26 20:09) ※ 編輯: amigcamel 來自: 140.112.4.198 (11/26 20:11)

11/26 20:34, , 1F
這個例子我會用 /<[^<>]>/來抓
11/26 20:34, 1F

11/26 20:34, , 2F
錯了="= 想寫/<[^<>]*>/ 的
11/26 20:34, 2F

11/26 20:38, , 3F
那請問一下,可以解釋一下"?"那邊出了什麼問題嗎?
11/26 20:38, 3F

11/26 20:44, , 4F
你大概誤解了greedy的意思了,?是往右邊限制,不是左邊
11/26 20:44, 4F
文章代碼(AID): #1Ib8yzby (Python)
討論串 (同標題文章)
以下文章回應了本文
1
1
完整討論串 (本文為第 1 之 2 篇):
1
1
0
4
文章代碼(AID): #1Ib8yzby (Python)