首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python Regex不一致性

Python Regex不一致性
EN

Stack Overflow用户
提问于 2017-08-31 05:25:22
回答 1查看 87关注 0票数 3

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

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

第一个例子:

表达方式:

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

案文:

王建民,刘晓明,钱建安。代理网络容忍拒绝服务攻击的实证研究。“USENIX安全专题讨论会议事录”,2002年。

王建民,刘晓明,钱建安。代理网络容忍拒绝服务攻击的实证研究。“USENIX安全专题讨论会议事录”,2002年。

比赛:

匹配1

  1. 王王
  2. 2002年

火柴2

  1. R
  2. 2002年

第二个例子:

表达方式:

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

案文:

王建民,刘晓明,钱建安。代理网络容忍拒绝服务攻击的实证研究。“USENIX安全专题讨论会议事录”,2002年。

王建民,刘晓明,钱建安。代理网络容忍拒绝服务攻击的实证研究。“USENIX安全专题讨论会议事录”,2002年。

比赛:

匹配1

  1. 王建民
  2. 2002年

火柴2

  1. R
  2. 2002年

我遗漏了什么?

我希望这会表现得有点不同,我认为这场比赛是一致的。我认为它应该是什么(而且还不明白为什么不应该是这样):

示例1

匹配1

  1. 王王
  2. 2002年

火柴2

  1. 王王
  2. 2002年

示例2

匹配1

  1. 王建民
  2. 2002年

火柴2

  1. 王建民
  2. 2002年
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 05:53:09

在第一个例子中,您期望第二行与“Wang Wang”匹配。<<例1>>清楚地表明这不是正在发生的事情。

在第一场比赛之后,它以‘2002’结束。-正则表达式试图匹配以\n\nR. wang Wang开头的其余部分。在您的第一个regex中,第一个非捕获组与它不匹配,所以您的组1接管并匹配它,最后得到'\n\nR‘。

代码语言:javascript
运行
复制
(?:                   # 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}):参见例3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45973788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档