求高手帮忙写一个参考文献的正则表达式,格斯如下
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求高手帮忙写一个参考文献的正则表达式,格斯如下相关的知识,希望对你有一定的参考价值。
作者,作者,作者.文章标题.杂志名称.2009;11(4):102-107.
作者.文章标题.杂志名称.2009;11(4):24-28.
(标点均为英文标点,作者为一个或多个,年不超过四位,括号里的数字不超过两位)
谢谢高手了!
# encoding: utf-8
import re
# 正则表达式定义
patt = re.compile(r\'\'\'
(?P<authors>.+?)\\.
(?P<title>.+?)\\.
(?P<magazine>.+?)\\.
(?P<year>\\d4);
(?P<month>\\d+)
\\((?P<period>\\d1,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\'(.+?)\\.(.+?)\\.(.+?)\\.(\\d4);(\\d+)\\((\\d1,2)\\):(\\d+-\\d+)\\.\', re.X|re.I|re.U)
但现在更喜欢这种命名方式的正则表达式,可以比较清晰地知道每个段落是什么信息,并可在后面直接使用。
写是能写,请给出样本数据供测试:
对样本成功即是符合题意。追问
作者个数不一定的
追答$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]+?\.\d4;\d+\(\d1,2\):\d+-\d+\./';
preg_match_all($p, $s,$m);
var_dump($m);
echo '匹配整个内容和每个项,php专用';
$p='/\s*(?[^.,\n]+?(,[^.,\n]+?)*?)\.(?[^.,\n]+?)\.(?[^.,\n]+?)\.(?\d4);(?\d+)\((?\d1,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)
篇幅限制,省略了大部分输出
以上是关于求高手帮忙写一个参考文献的正则表达式,格斯如下的主要内容,如果未能解决你的问题,请参考以下文章