[問題] 關於regular expression的\b問題

看板Python作者 (黃~)時間8年前 (2017/10/11 09:18), 編輯推噓2(2020)
留言22則, 7人參與, 8年前最新討論串1/1
各位大大好,小弟想請教一個關於\b範例的問題 ex1.result=re.findall(r'\b[^aeiouAEIOU]\w+','AV is largest Analytics community of India') 如果把\b給去掉,print(result)會得出一樣的結果 >>>print(result) [' is', ' largest', ' Analytics', ' community', ' of', ' India'] 想要請教一下,為甚麼呢,謝謝~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.83.192.197 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1507684713.A.015.html

10/11 09:31, 8年前 , 1F
說說看你對\b的了解
10/11 09:31, 1F

10/11 10:09, 8年前 , 2F
這段regex想匹配什麼單字?
10/11 10:09, 2F

10/11 11:13, 8年前 , 3F
b是邊界 , 不管有沒有邊界你都findall了 就會全部匹配
10/11 11:13, 3F

10/11 13:10, 8年前 , 4F
我對於\b的概念是,\b就是word boundary
10/11 13:10, 4F

10/11 13:11, 8年前 , 5F
而且\b 是屬於zero width assertion,不會占用任何
10/11 13:11, 5F

10/11 13:11, 8年前 , 6F
字元,而word boundary 就是不屬於alphanumeric
10/11 13:11, 6F

10/11 13:12, 8年前 , 7F
charcter,而且不是空白鍵,也不是底線
10/11 13:12, 7F

10/11 13:13, 8年前 , 8F
照ptt0720大大的概念,我應該是對finall不太清楚
10/11 13:13, 8F

10/11 16:08, 8年前 , 9F
這段regex想要匹配非母音開頭的單字喔
10/11 16:08, 9F

10/11 16:10, 8年前 , 10F
正確的解法是\b[^aeiouAEIOU ],多一個空白鍵
10/11 16:10, 10F

10/11 21:56, 8年前 , 11F
後來想了一下,是因為findall是逐字掃描
10/11 21:56, 11F

10/11 21:58, 8年前 , 12F
而[^aeiouAEIOU]\w+也是碰碰word boundary而停止的
10/11 21:58, 12F

10/11 21:58, 8年前 , 13F
所以\b才會有加跟沒加結果都一樣?
10/11 21:58, 13F

10/11 22:41, 8年前 , 14F
並不是 \b 放在開頭就只會 match 到單字開頭的邊界,
10/11 22:41, 14F

10/11 22:42, 8年前 , 15F
這兩個 re 並不等價,在這個句子只是碰巧產生相同結果。
10/11 22:42, 15F

10/11 22:42, 8年前 , 16F
把句子換成 'Apples on the tree' 或是 'My arm',
10/11 22:42, 16F

10/11 22:42, 8年前 , 17F
就可以明白其中差異。
10/11 22:42, 17F

10/11 22:57, 8年前 , 18F
\b 是字元與非字元的邊界,少掉這個你的集合更大了
10/11 22:57, 18F

10/11 22:58, 8年前 , 19F
你把例子的 AV 換成 MV, 這樣結果還是一樣嗎?
10/11 22:58, 19F

10/11 23:03, 8年前 , 20F
上面例子不對應該是 AV -> AVV 這樣就不一樣了
10/11 23:03, 20F

10/12 19:10, 8年前 , 21F
好的,謝謝s大解答~
10/12 19:10, 21F

10/13 00:08, 8年前 , 22F
(?=\b[^aeiouAEIOU])\w+ 試出這樣可以選出來
10/13 00:08, 22F
文章代碼(AID): #1PtN5f0L (Python)