正则表达式总是让我头疼。我正在尝试匹配一个模式,只有在前后两个字符都不是数字的情况下才能匹配成功,如果其中一个字符是数字也可以。例如 "Zeitraum vom 1. 6. -30. 6.",我想匹配破折号 (-),但对于 "12-3-2019"(破折号前后的字符都是数字)则不应匹配成功。目前我正在尝试排除法,但这似乎只适用于前后都不是数字的情况。
[^\d]-[^\d]
谢谢您
您可以使用
r'-(?<!\d-(?=\d))'
(?=\d)
,而不能使用简单的\d
,因为在连字符-之后使用否定回顾(?<!\d-\d)
时,当回溯时会导致匹配失败。
详细信息
-
- 连字符 (?<!
- 负向回顾开始:如果当前位置左侧紧邻处有
\d
- 数字-
- 连字符(?=\d)
- 接下来是\d
)
- 回顾结束您可以使用替代:
(?<!\d)-|-(?!\d)
这个匹配与连字符不紧跟在数字前面或不紧跟在数字后面相对应。
(?<!..)
构造是负向先行断言,它是一个零长度的断言,确保当前位置之前没有数字。请参见:https://www.regular-expressions.info/lookaround.html - Toto