正则表达式noob问题

时间:2015-05-20 03:36:47

标签: python regex

所以这是我的字符串:

"""$10. 2109 W. Chicago Ave., 773-772-0406, <a href="http://www.theoldoaktap.com/">theoldoaktap.com</a>"""

我知道这是正确的正则表达式,可以给我我想要的东西(输出如下):

age = re.match(r'\$([\d.]+)\. (.+), ([\d-]+)', example)
print age.groups()

output ====> ('10', '2109 W. Chicago Ave.', '773-772-0406')

但即使在阅读了doc:

后,我对正则表达式也有一些疑问
  1. 当与()括号分组时,那些是正则表达式最终返回的单独元组值,对吗?
  2. 如果我删除$符号,为什么整个事情会完全与error:unbalanced parenthesis分解?不管我是否事先指定$,正则表达式都不能在$之后获取价格吗?如果我希望输出为10美元而不是10美元,那么为什么我不能将$移到内部而只是运行r'\($[\d.]+)?它引发了另一个不平衡的括号错误。
  3. 在中间的(.+),之后,逗号是python知道我们完成的唯一方法是将值插入第二个元组值槽吗?所以,(。+)并不能真正意味着任何角色&#39;可以?如果恰好跟在数字后面,逗号会将其移动到下一个字符,对吗?
  4. 有人可以解释在括号内而不是在外面放置+符号以及它如何产生影响?
  5. 抱歉这个非常棒的问题。有一天病得好。提前谢谢。

1 个答案:

答案 0 :(得分:3)

  

当与()括号分组时,那些是正则表达式最终返回的单独元组值,对吗?

正确

  

如果我删除$符号,为什么整个事情完全崩溃并出现错误:不平衡的括号?不管我是否事先指定了$,正则表达式是否应该能够在$之后获取价格?

如果删除美元符号,则转义字符\将转义开头括号字符(,告诉正则表达式引擎不要将其视为需要在字符串中搜索的文字字符。

  

在(。+)之后,在中间,是逗号是python知道我们完成的唯一方法是将值插入到第二个元组值槽中吗?

是的,它告诉Python在最后一个逗号之前捕获几乎任何字符中的一个或多个。 .匹配几乎任何单个字符。 .+匹配几乎任何字符中的一个或多个。

请注意,.+是贪婪的,这意味着它会在最后一个之前继续捕获逗号。如果您希望它在第一个逗号之前停止,您可以使用.+?

使其变得懒惰
  

有人可以解释括号内的+符号的位置,而不是外部,以及它如何产生影响?

它不会改变+的行为,无论是在内部还是外部。它只会改变被捕获到群组中的内容。

修改

  

为什么我不能移动$ inside而只是运行r'($ [\ d。] +)?它引发了另一个不平衡的括号错误。

这是因为$也具有特殊含义(意味着匹配行尾),就像正则表达式中的()一样,这意味着你需要转义它想要的匹配文字字符就像你转义括号一样:\$