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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求高手帮忙写一个参考文献的正则表达式,格斯如下相关的知识,希望对你有一定的参考价值。

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

#!python2.7
# 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)
但现在更喜欢这种命名方式的正则表达式,可以比较清晰地知道每个段落是什么信息,并可在后面直接使用。

参考技术A /.*?,.*?,.*?\..*?\.\d4;\d2\(\d1,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]+?\.\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)

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

以上是关于求高手帮忙写一个参考文献的正则表达式,格斯如下的主要内容,如果未能解决你的问题,请参考以下文章

求同时匹配国内电话和手机正则表达式

求大神帮忙写一个只允许是百分数的js正则表达式(从0%至100%,中间数字允许两位小数)。

正则表达式匹配中文,Python语句该怎么写?求帮忙。

js 正则表达式 验证公司名称 请高手写下?谢谢!

PHP 帮忙写个正则表达式 判断QQ邮箱格式

求JS正则高手,把一个字符串替换成空串,50分