Python正则表达式不一致

时间:2017-08-31 05:25:22

标签: python regex

对于几个不同的正则表达式,我发现正则表达式的可选和条件部分对第一个匹配和后续匹配的行为不同。这是使用python,但我发现它一般保留。

以下两个类似的例子说明了这个问题:

第一个例子:

表达式:

(?:\w. )?([^,.]*).*(\d{4}\w?)

文本:

学家王旺,X。刘和A. A. Chien。用代理网络容忍服务攻击的实证研究。在USENIX Security Symposium,2002年的会议记录中。

R上。王旺,X。刘和A. A. Chien。用代理网络容忍服务攻击的实证研究。在USENIX Security Symposium,2002年的会议记录中。

匹配

匹配1

  1. 王旺
  2. 2002
  3. 匹配2

    1. - [R
    2. 2002
    3. 第二个例子:

      表达式:

      ((?:\w\. )?[^,.]*).*(\d{4}\w?)

      文本:

      学家王旺,X。刘和A. A. Chien。用代理网络容忍服务攻击的实证研究。在USENIX Security Symposium,2002年的会议记录中。

      R上。王旺,X。刘和A. A. Chien。用代理网络容忍服务攻击的实证研究。在USENIX Security Symposium,2002年的会议论文集中。

      匹配

      匹配1

      1. 学家王旺
      2. 2002
      3. 匹配2

        1. - [R
        2. 2002
        3. 我缺少什么?

          我希望这种行为有点不同,我认为匹配会保持一致。我认为它应该是什么(并且还不明白为什么不是):

          示例1

          匹配1

          1. 王旺
          2. 2002
          3. 匹配2

            1. 王旺
            2. 2002
            3. 示例2

              匹配1

              1. 学家王旺
              2. 2002
              3. 匹配2

                1. R上。王旺
                2. 2002

1 个答案:

答案 0 :(得分:1)

在你的第一个例子中,你希望第二行匹配'王旺'。 << example 1>>清楚地表明这不是正在发生的事情。

第一场比赛结束后,以“2002”结束。 - 正则表达式尝试匹配以\n\nR. wang Wang开头的剩余部分。在您的第一个正则表达式中,第一个非捕获组与此不匹配,因此您的组1接管并匹配,最后以'\ n \ nR'结束

(?:                   # non-capturing group 
  \w.                 # word char, followed by 1 char, followed by space
)?                    # read 0 or 1 times      
(                     # start group 1
[^,.]*                # read anything that's not a comma or dot, 0 or more times
)                     # end group 1
.*                    # read anything 
(                     # start group 2
\d{4}                 # until there's 4 digits 
\w?                   # eventually followed by word char
)                     # end group 2

这同样适用于您的第二个正则表达式:即使在这里,您的非捕获组(?:\w\. )?也不会使用R.,因为在首字母前面有一个点和一些换行符。

您可以像([A-Z]\.)\s([^.,]+).*(\d{4})一样解决它:请参阅example 3