求高手帮忙写一个参考文献的正则表达式,格斯如下

我请讲解下,求高手帮忙写一个参考文献的正则表达式,格斯如下?

作者,作者,作者.文章标题.杂志名称.2009;11(4):102-107.
作者.文章标题.杂志名称.2009;11(4):24-28.
(标点均为英文标点,作者为一个或多个,年不超过四位,括号里的数字不超过两位)
谢谢高手了!
最新回答
瑾沫流年

2024-05-11 03:28:47

#!python2.7
# encoding: utf-8

import re
# 正则表达式定义
patt = re.compile(r'''
(?P<authors>.+?)\.
(?P<title>.+?)\.
(?P<magazine>.+?)\.
(?P<year>\d{4});
(?P<month>\d+)
\((?P<period>\d{1,2})\):
(?P<pages>\d+-\d+)\.
''', re.X|re.I|re.U)

# 待解析的数据
content = '''
作者,作者,作者.文章标题.杂志名称.2009;11(4):102-107.
作者.文章标题.杂志名称.2009;11(4):24-28.
'''

def parserline(ln):
''' 解析一行数据 '''
m = patt.match(ln)
if m:
m = m.groupdict()
m['authors'] = m['authors'].split(',')
return m

def showdict(d):
''' 将字典数据作为字符串返回,以便打印 '''
return '\n'.join([
'%10s: %s'%(k, v if not isinstance(v,(list,))
else ('[%s]'%', '.join(v))
)
for k, v in d.items()])

for ln in content.splitlines():
m = parserline(ln)
if m:
print showdict(m)
print '----'

执行结果如下
>pythonw -u "baidu.py"
title: 文章标题
year: 2009
period: 4
month: 11
magazine: 杂志名称
authors: [作者, 作者, 作者]
pages: 102-107
----
title: 文章标题
year: 2009
period: 4
month: 11
magazine: 杂志名称
authors: [作者]
pages: 24-28
----
>Exit code: 0 Time: 0.503
追问
亲,你写的是什么
追答
在Python中“用正则表达式解析参考文献信息”啊
正则的定义在 patt = re.compile ...段落里
处理过程是那个for循环, 所涉及到的两个辅助函数在前面有说明。
最后是解析的输出结果。
其实,早先的话我常用下面的样式:
patt = re.compile(r'(.+?)\.(.+?)\.(.+?)\.(\d{4});(\d+)\((\d{1,2})\):(\d+-\d+)\.', re.X|re.I|re.U)
但现在更喜欢这种命名方式的正则表达式,可以比较清晰地知道每个段落是什么信息,并可在后面直接使用。
沉鱼落雁

2024-05-11 00:03:27

/.*?,.*?,.*?\..*?\.\d{4};\d{2}\(\d{1,2}\):\d+-\d+\./
写是能写,请给出样本数据供测试:
对样本成功即是符合题意。
追问
作者个数不一定的
追答
$s='作者1,作者2,作者3.文章标题.杂志名称.2009;11(4):102-107.乱码啊的
作者4.文章标题2.杂志名称2.2009;11(4):24-28.ilw3iordsfsdf
作者5,作者6.文章标题3.杂志名称3.2009;11(4):24-28.dfsfjhsdfs
作者7,作者8,作者9.文章标题4.杂志名称4.2019;11(4):24-28.5123892e218
作者10.文章标题5.杂志名称5.2509;11(4):24-28.上大家阿阿斯顿
Crazy Person.Eng title5.mag name5.2509;11(4):24-28.上大家阿阿斯顿';

echo '匹配整行版,任何语言通用';
$p='/\s*[^.\n]+?(?:,[^.,\n]+?)*?\.[^.,\n]+?\.[^.,\n]+?\.\d{4};\d+\(\d{1,2}\):\d+-\d+\./';
preg_match_all($p, $s,$m);
var_dump($m);

echo '匹配整个内容和每个项,php专用';
$p='/\s*(?[^.,\n]+?(,[^.,\n]+?)*?)\.(?[^.,\n]+?)\.(?[^.,\n]+?)\.(?\d{4});(?\d+)\((?\d{1,2})\):(?\d+-\d+)\./';
preg_match_all($p, $s,$m);
var_dump($m[0],$m['author'],$m['title'],$m['mag'],$m['y'],$m['m'],$m['n'],$m['sn']);
================================
显示输出

匹配整行版,任何语言通用
array
0 =>
array
0 => string '作者1,作者2,作者3.文章标题.杂志名称.2009;11(4):102-107.' (length=55)
1 => string '
作者4.文章标题2.杂志名称2.2009;11(4):24-28.' (length=45)
2 => string '
作者5,作者6.文章标题3.杂志名称3.2009;11(4):24-28.' (length=51)
3 => string '
作者7,作者8,作者9.文章标题4.杂志名称4.2019;11(4):24-28.' (length=57)
4 => string '
作者10.文章标题5.杂志名称5.2509;11(4):24-28.' (length=46)
5 => string '
Crazy Person.Eng title5.mag name5.2509;11(4):24-28.' (length=53)

匹配整个内容和每个项,php专用
array
0 => string '作者1,作者2,作者3' (length=17)
2 => string '作者5,作者6' (length=11)
3 => string '作者7,作者8,作者9' (length=17)
5 => string 'Crazy Person' (length=12)

array
5 => string 'Eng title5' (length=10)

array
5 => string 'mag name5' (length=9)

array
5 => string '2509' (length=4)
array
5 => string '11' (length=2)

array
5 => string '4' (length=1)

array
5 => string '24-28' (length=5)

篇幅限制,省略了大部分输出