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

时间:2015-07-14 07:30:17

标签: python regex

我试图从Thomson-Reuters Web of Science中提取出版年份的ISI风格数据。 "出版年份"看起来像这样(在一行的最开头):

PY 2015

对于我写的脚本,我已经定义了以下正则表达式函数:

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似乎可以做我想要的,但这可能会给我带来进一步的复杂性。

3 个答案:

答案 0 :(得分:13)

re.findall(r'^PY (\d\d\d\d)', wosrecords, flags=re.MULTILINE)

应该有效,如果没有,请告诉我。我没有您的数据。

答案 1 :(得分:4)

re.searchre.M

一起使用
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+ - 一个或多个空格
  • (\d{4}) - 捕获4位数的小组

答案 2 :(得分:0)

在这种特殊情况下,不需要使用正则表达式,因为搜索到的字符串始终是&#39; PY&#39;并且预计将在该行的开头,因此可以使用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

接下来如果只关注年份,可以用拆分提取,即:

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