繁体   English   中英

Python正则表达式:匹配段落编号

[英]Python Regex: Match paragraph numbers

我试图在我的文本块内匹配段落编号。 给出以下句子:

有关示例,请参阅第C.2.1a.5段。

我想匹配单词C.2.1a.5

我当前的代码如下:

([0-9a-zA-Z]{1,2}\.)

仅匹配C.2.1a. es. ,这不是我想要的。 有没有办法匹配完整的C.2.1a.5而不匹配es.

https://regex101.com/r/cO8lqs/13723

我尝试使用^$ ,但这样做不会返回任何匹配项。

您应使用以下正则表达式来匹配文本中的段落编号。

\b(?:[0-9a-zA-Z]{1,2}\.)+[0-9a-zA-Z]\b

试试这个演示

这是解释,

  • \\b匹配单词边界,因此避免像examples.一样在大单词中部分匹配examples.
  • (?:[0-9a-zA-Z]{1,2}\\.)+ -这与您尝试在自己的正则表达式中进行匹配的长度为一或二的字母数字文本匹配。
  • [0-9a-zA-Z] -最后,比赛以结尾的一个字母数字字符结束。 如果您也希望它在末尾也匹配一个或两个字母数字字符,只需在其后添加{1,2}
  • \\b再次匹配单词边界,以确保在大单词中部分不匹配。

编辑:

有人指出,如果您的文本包含AAAAAAAAA甚至1.2字符串,并且您不想匹配这些字符串,而只希望匹配其中恰好有三个点的字符串,则应使用以下正则表达式具体用于匹配您的段落编号。

(?<!\.)\b(?:[0-9a-zA-Z]{1,2}\.){3}[0-9a-zA-Z]\b(?!\.)

这个新的正则表达式仅匹配正好具有三个点的段落编号,并且这些否定的前/后确保不完全匹配AAAAAA大字符串

更新了正则表达式演示

检查这些python示例代码,

import re

s = 'Refer to paragraph C.2.1a.5 for examples. Refer to paragraph A.A.A.A.A.A.A for examples. Some more A.A.A or like 1.22'
print(re.findall(r'(?<!\.)\b(?:[0-9a-zA-Z]{1,2}\.){3}[0-9a-zA-Z]\b(?!\.)', s))

输出,

['C.2.1a.5']

同样为了尝试使用^$ ,它们分别称为开始锚和结束锚,如果在正则表达式中使用它们,那么它们将期望匹配行首和行尾,这并不是您真正打算做的,因此您不应该使用它们,就像您已经看到的那样,在这种情况下使用它们将无效。

如果需要简单版本,则可以使用此易于理解和修改的正则表达式([AZ]{1}\\.[0-9]{1,3}\\.[0-9]{1,3}[az]{1}\\.[0-9]{1,3})

我认为我们应该使正则表达式保持简单易读。 您可以使用正则表达式

**(?:[a-zA-Z]+\.){3}[a-zA-Z]+**

说明-

  • 表达式(?:[a-zA-Z] +。){3}确保单词中的组(?:[a-zA-Z] +。)重复3次。 该组包含一个字母字符,后跟一个点。
  • 该词将以字母字符结尾。 输出:['C.2.1a.5']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM