-1

我正在尝试匹配我的文本块中的段落编号。给定以下句子:

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

我想匹配这个词C.2.1a.5

我当前的代码如下:

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

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

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

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

4

3 回答 3

2

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

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

试试这个演示

这里是解释,

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

编辑:

正如有人指出的那样,如果您的文本包含类似A.A.A.A.A.A.orA.A.A或 even的字符串1.2并且您不想匹配这些字符串而只想匹配其中恰好包含三个点的字符串,您应该使用以下正则表达式,它在匹配方面更具体你的段落编号。

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

这个新的正则表达式仅匹配恰好具有三个点的段落编号,并且那些否定的向前/向后看确保它不会在大字符串中部分匹配,例如A.A.A.A.A.A

更新的正则表达式演示

检查这些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']

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

于 2019-09-14T08:49:08.007 回答
1

如果需要简单的版本,您可以使用这个易于理解和修改的正则表达式([A-Z]{1}\.[0-9]{1,3}\.[0-9]{1,3}[a-z]{1}\.[0-9]{1,3})

于 2019-09-14T09:36:45.930 回答
0

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

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

解释 -

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