在Python正则表达式中使用^匹配行首

2024-05-17 04:04:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从汤森路透科学网(Thomson Reuters Web of Science)中提取出出版年份的ISI风格数据。“出版年”的行如下所示(在行的开头):

PY 2015

对于我正在编写的脚本,我定义了以下regex函数:

import re
f = open('savedrecs.txt')
wosrecords = f.read()

def findyears():
    result = re.findall(r'PY (\d\d\d\d)', wosrecords)
    print result

findyears()

然而,这会产生假阳性结果,因为模式可能出现在数据的其他地方。

所以,我只想匹配一行开头的模式。通常我会为此使用^,但是r'^PY (\d\d\d\d)'无法匹配我的结果。另一方面,使用\n似乎可以达到我的目的,但这可能会导致我的进一步复杂化。


Tags: of数据pyreweb模式resultscience
3条回答

在这种特殊情况下,不需要使用正则表达式,因为搜索的字符串始终是“PY”,并且应该在行首,因此可以使用string.find来执行此作业。find函数返回在给定字符串或行中找到子字符串的位置,因此如果在字符串的开头找到子字符串,则返回值为0(如果根本没有找到,则返回值为-1),即:

In [12]: 'PY 2015'.find('PY')
Out[12]: 0

In [13]: ' PY 2015'.find('PY')
Out[13]: 1

也许把空白处去掉是个好主意,即:

In [14]: '  PY 2015'.find('PY')
Out[14]: 2

In [15]: '  PY 2015'.strip().find('PY')
Out[15]: 0

下一步,如果对年份感兴趣,则可以使用split提取,即:

In [16]: '  PY 2015'.strip().split()[1]
Out[16]: '2015'

re.M一起使用re.search

import re
p = re.compile(r'^PY\s+(\d{4})', re.M)
test_str = "PY123\nPY 2015\nPY 2017"
print(re.findall(p, test_str)) 

IDEONE demo

说明

  • ^-行的开始(由于re.M
  • PY-文字PY
  • \s+-1或更多空白
  • (\d{4})-捕获组包含4位数字
re.findall(r'^PY (\d\d\d\d)', wosrecords, flags=re.MULTILINE)

应该有用的,如果不行就告诉我。我没有你的数据。

相关问题 更多 >