正则表达式匹配参考文献脚注时出现不符合预期的行为
正则表达式匹配参考文献脚注时出现不符合预期的行为
我来帮你分析下这个问题,核心原因其实是破折号的字符类型不匹配!
你看,你的正则表达式里用的\-对应普通的短破折号(ASCII码U+002D),但测试文本"Author, Some Book, 51–66."里的破折号是长破折号(EN Dash,Unicode码U+2013)——这是两个完全不同的字符,所以正则里的\-根本匹配不到长破折号,导致整个PATTERN匹配失败,也就是match_A为None,输出False。
而match_B里用的是短破折号,刚好和正则里的\-匹配,所以能成功输出True。
至于你说SUB_PATTERN能匹配长破折号的情况,大概率是你测试match_C和match_D时,文本里的破折号其实是短破折号(或是输入时被编辑器自动转换了),所以才能匹配成功。
那怎么解决这个问题呢?你只需要修改正则,让它同时支持短破折号和长破折号就行,这里给你两种方案:
- 直接在正则里枚举两种破折号:
PATTERN = "[\\w ]+, [\\w ]+, (\\d+([\\-–]\\d+)?)\\."
这里的[\-–]表示同时匹配短破折号-和长破折号–。
- 如果你还需要支持其他类型的破折号(比如更长的EM Dash U+2014),可以用Unicode属性匹配所有破折号:
PATTERN = "[\\w ]+, [\\w ]+, (\\d+(\\p{Pd}\\d+)?)\\."
注意:Python的re模块默认不支持Unicode属性,需要加上re.UNICODE标志(或简写re.U),使用时要写成:
match_A = re.search(PATTERN, "Author, Some Book, 51–66.", flags=re.UNICODE)
你试试修改后的正则,不管是短破折号还是长破折号的情况,应该都能匹配成功了。
备注:内容来源于stack exchange,提问作者andrescg2sj
相关产品推荐
相关产品推荐

