Q1。为什么我们不能在正则表达式的开头使用r
而不使用单词边界和反向引用?
例如'\b[a-z]{5}\d{3}\b'
这不起作用,但此r'\b[a-z]{5}\d{3}\b'
有效
Q2。为什么python不支持variable length negative look behind assertions
,而它支持variable length negative look ahead assertion
,c#
支持两者,我认为在variable length negative look behind
中python
也是一个很好的功能。< / p>
请清除这两个概念。感谢
答案 0 :(得分:4)
没有原始字符串它可以正常工作:
'\\b[a-z]{5}\\d{3}\\b'
你只需要双重逃避特殊字符(实际上,你所做的就是逃避所有反斜杠)。
可变长度断言是某些实现支持的功能之一,有些则不支持。查看regex module on PyPI以获取具有更多功能和更好的unicode支持的版本,这可能最终取代标准库re
。
编辑:要使评论中的版本无原始字符串,请使用:
re.sub('[a-z]+(\d+)', '\\1', string)
再次,Python解释反斜杠。它认为\1
表示字节值1
。如果你的意思是\1
,你需要通过执行\\1
来逃避反斜杠,或者使用原始字符串。
编辑2:将@ Nate评论中的链接添加到list of Python escape sequences。
答案 1 :(得分:1)
关于你的第一个问题,这是因为r
指定了“原始字符串”。如果没有此r
,则反斜杠将被解释为转义码。如果您不想使用原始字符串,则可以使用'\\b[a-z]{5}\\d{3}\\b'
,尽管这不太可读。您可以阅读有关raw strings here。
关于你的第二个问题,你应该看看this excellent question,它讨论了不同语言(即C#,Java和Python)使用的各种正则表达式之间的差异。
答案 2 :(得分:0)
您可以在tutorial - which is your the best friend中找到几乎所有信息:
正则表达式使用反斜杠字符('\')来表示 特殊形式或允许使用特殊字符 唤起他们的特殊意义。这与Python的使用相冲突 字符串文字中用于相同目的的相同字符;对于 例如,要匹配文字反斜杠,可能必须写'\\' 作为模式字符串,因为正则表达式必须是\,和 每个反斜杠必须表示为常规Python字符串中的\ 文字。
解决方案是使用Python的常规字符串表示法 表达模式;反斜杠不以任何特殊方式处理 带有'r'前缀的字符串文字。所以r“\ n”是一个双字符串 包含'\'和'n',而“\ n”是一个单字符的字符串 包含换行符。通常模式将用Python表示 使用此原始字符串表示法的代码。
很难回答你的第二个问题 - 我认为作者只是在实施他们认为需要的功能。他们尝试添加对大多数用户有用的代码,但不可能快速实现所有功能。