使用RegEx查找数字后跟点

时间:2018-11-23 20:23:29

标签: python regex

我正在尝试在参考文献列表中找到参考文献的索引。让我举例说明:

这是我从网站上抓取的参考文献列表:

ref = "<p class="references" style="font-size:15px">1. Mcminn. (2003). Last's Anatomy. Elsevier Australia. ISBN:0729537528. <a href="http://books.google.com/books?vid=ISBN0729537528">Read it at Google Books</a> - <a href="http://www.amazon.com/gp/product/0729537528">Find it at Amazon</a><br>
2. Netter, F. H. (2019). Atlas of human anatomy. Philadelphia, PA: Elsevier.</p>"

我认为我可以使用以下方法获取参考索引(即“ 1.”和“ 2。”)。

result = list(map(int, [e for e in re.split("[^0-9]", ref) if e != '']))

但是我得到所有数字:[1, 2003, 729537528, 2, 2019]

我如何仅获取参考索引列表,即[1, 2],我想一种方法是找到数字后跟一个点,但是我不知道怎么做。

3 个答案:

答案 0 :(得分:1)

您可以使用

list(map(int, re.findall(r"(?<![^\s>])([0-9]+)\. ", ref)))

请参见Python demo

import re
p_text="""ref = <p class="references" style="font-size:15px">1. Mcminn. (2003). Last's Anatomy. Elsevier Australia. ISBN:0729537528. <a href="http://books.google.com/books?vid=ISBN0729537528">Read it at Google Books</a> - <a href="http://www.amazon.com/gp/product/0729537528">Find it at Amazon</a><br>
2. Netter, F. H. (2019). Atlas of human anatomy. Philadelphia, PA: Elsevier.</p>"""
result = list(map(int, re.findall(r"(?<![^\s>])([0-9]+)\. ", p_text)))
print(result) # => [1, 2]

详细信息

  • (?<![^\s>])-如果紧接当前位置左侧的字符不是空格和>
  • ,则负向后搜索将使匹配失败
  • ([0-9]+)-第1组:一个或多个数字(它将是re.findall的输出值)
  • . -一个.和一个空格(用\s替换常规空格以匹配任何空白)。

请参见regex demo

答案 1 :(得分:1)

您可以尝试以下方法:

import re
o = re.findall(r'[>|\s](\d{1})\.', ref)
print(o)

将输出:

['1', '2']

您可能需要定义更多的结构,因为仅数字(用\ d捕获的数字)和点也将捕获“ 8”。 ISBN号末尾:ISBN:0729537528。在这里,我使用了一些字符(在本示例中)有助于区分这两种情况。一个引用前面有一个'>',另一个引用前面有一个空格(\ s)。

答案 2 :(得分:0)

您必须“转义”句号,例如“ [0-9] * \”。应该管用。那太过头了,所以可能有点不对劲。我也将由您自己决定为什么存在*。

请注意,Python中的Regex表达式与其他实现略有不同。有关确定的信息,请参见:

请参阅:https://docs.python.org/3/library/re.html

这表明您应该从这里开始:

https://docs.python.org/3/howto/regex.html#regex-howto

这是库页面的相关部分(大约1/3):

特殊序列由'\'和下面列表中的字符组成。如果普通字符不是ASCII数字或ASCII字母,则结果RE将与第二个字符匹配。例如,\ $与字符“ $”匹配。

对于等效的python 2.x页面,请更改页面左上角的版本选择器。