关于python正则表达式的两个问题

时间:2011-08-18 11:13:20

标签: c# python regex

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 assertionc#支持两者,我认为在variable length negative look behindpython也是一个很好的功能。< / p>

请清除这两个概念。感谢

3 个答案:

答案 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表示   使用此原始字符串表示法的代码。

很难回答你的第二个问题 - 我认为作者只是在实施他们认为需要的功能。他们尝试添加对大多数用户有用的代码,但不可能快速实现所有功能。