簡體   English   中英

為什么帶有單詞邊界的正則表達式會失敗?

[英]Why does my regex with word boundary fail?

我想匹配數字,可以是正數也可以是負數,可能前面要有貨幣符號。 但是我不想要像PSM-9這樣的東西。 我的代碼是:

test='AAA PCSK-9, $111 -3,33'
re.findall(r'\b-?[$€£]?-?\d+[\d,.]*\b', test)

輸出為: ['-9', '111', '3,33']有人可以解釋為什么匹配-9嗎? 先感謝您。

編輯:我不匹配PCSK-9的任何部分,就像產品的名稱而不是數字。 所以我想要的輸出是:

['111', '3,33']

這是因為\\b匹配K-之間的K ,即單詞和非單詞字符。 如果您想避免匹配-如果前面有一個單詞,則可以改用負向后搜索:

re.findall(r'[$€£]?(?:(?<!\w)-)?\d+[\d,.]*\b', test)

使用您的樣本輸入,將返回:

['9', '111', '3,33']

演示: https : //regex101.com/r/A66C5W/1

單詞邊界在K和破折號之間匹配。 破折號[$€£]?-?之后的2個部分 是可選的,因為有問號,然后您將一個或多個數字匹配一次。 結果為-9

可以使用一個斷言來代替單詞邊界,該斷言使用負向后看和負向后看來檢查匹配之前和之后的內容是否不是非空格字符\\S

(?<!\\S)-?[$€£]?(\\d+(?:[,.]\\d+)?)(?!\\S)

正則表達式演示 | Python演示

匹配-9是因為-是一個非單詞字符,而S是一個單詞字符...因此,正如您在正則表達式中指出的那樣,在它們之間有一個單詞間邊界\\b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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