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)
我理解的逻辑是前瞻和后视强制任何匹配成为一个完整的“单词”,从那里开始,您将不必再担心匹配中的数字,因为它们不是定义字符的一部分无论如何设置要匹配。
添加回答
举报