2 回答

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

TA貢獻1796條經驗 獲得超4個贊
這個對我自己問題的回答的靈感來自 Wiktor Stribi?ew 的評論。它似乎工作。我把它張貼在這里,以便更敏銳的眼光可以告訴我它的任何缺陷。
regex_pat = re.compile('''
(?<!\S)
[a-zA-Z*]*
\*
[a-zA-Z*]*
(?!\S)
''', re.VERBOSE)
我理解的邏輯是前瞻和后視強制任何匹配成為一個完整的“單詞”,從那里開始,您將不必再擔心匹配中的數字,因為它們不是定義字符的一部分無論如何設置要匹配。
添加回答
舉報