亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式:使負面環視“更貪婪”

正則表達式:使負面環視“更貪婪”

鳳凰求蠱 2021-12-21 10:44:45
我有來自較早問題的以下 Python 正則表達式模式:regex_pat = re.compile('''            (            [a-zA-Z\*]*            \*            [a-zA-Z\*]*            )+                     ''', re.VERBOSE) 現在,如果任何數字與“單詞”混合在一起,尤其是在開頭或結尾,我希望匹配失敗。text = '''    (A) Match these:    *** star* st**r    (B) Not these:    800*m *4,500     (C) And not these:    800**m **4,000    '''通過在各個地方嘗試一對否定前瞻和否定后視,我可以擺脫 (B) 匹配,但不能擺脫 (C) 匹配。例如:regex_pat = re.compile('''            (            [a-zA-Z\*]*            (?<!\d)            \*            (?!\d)            [a-zA-Z\*]*            )+                     ''', re.VERBOSE) regex_pat.findall(text)# ['***', 'star*', 'st*r', '**m', '**'] The last two matches are no good.顯然,當正則表達式遇到負前瞻時,它會退后一步,看看它是否可以匹配??梢赃@么說,我怎樣才能使消極的環顧變得更貪婪或更具有破壞性?
查看完整描述

2 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

您可以使用

(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*

請參閱正則表達式演示。

細節

  • (?<!\S) - 字符串或空格的開頭

  • (?!\*+\d) - 如果在 1 個或多個星號后有數字,則匹配失敗

  • [a-zA-Z]* - 0+ 個字母

  • \* - 星號

  • [a-zA-Z*]* - 0+ 個字母或星號。

重點是在字符串的開頭或空格之后開始匹配,檢查1個或多個星號后是否沒有數字,然后匹配您需要的模式。

請參閱Python 演示

import re

text = '''

    (A) Match these:

    *** star* st**r


    (B) Not these:

    800*m *4,500 


    (C) And not these:

    800**m **4,000

    '''

print(re.findall(r'(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*', text))

# => ['***', 'star*', 'st**r']


查看完整回答
反對 回復 2021-12-21
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

這個對我自己問題的回答的靈感來自 Wiktor Stribi?ew 的評論。它似乎工作。我把它張貼在這里,以便更敏銳的眼光可以告訴我它的任何缺陷。


regex_pat = re.compile('''

            (?<!\S)

            [a-zA-Z*]*            

            \*

            [a-zA-Z*]*

            (?!\S)

          ''', re.VERBOSE) 

我理解的邏輯是前瞻和后視強制任何匹配成為一個完整的“單詞”,從那里開始,您將不必再擔心匹配中的數字,因為它們不是定義字符的一部分無論如何設置要匹配。


查看完整回答
反對 回復 2021-12-21
  • 2 回答
  • 0 關注
  • 277 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號