- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 PyParsing 时遇到了一些问题。我需要从简历中解析一些书目信息。一个例子:
AuthorA, B., AuthorB, M. R., AuthorC, V., and B. LastAuthor. Some sciency title. Name of the confernce, City, State, December 3, 2012
我想出了一些代码来解析(主要)作者列表和日期……其他信息对我来说不是特别重要。
from pyparsing import (Word, Literal, OneOrMore, alphanums, delimitedList, printables,
alphas, nums)
family_name = Word(alphanums+'-')
first_init = Word(alphanums+'.')
author = (family_name("LastName") + Literal(',').suppress() +
OneOrMore(first_init("FirstInitials") ) )
last_author = first_init("FirstInitials") + family_name("LastName")
author_list = delimitedList(author) + Literal('and').suppress() + last_author
sentence = OneOrMore(Word(printables))
location = delimitedList(Word(printables))
date = Word(alphas) + Word(nums) + Literal(',').suppress() + Word(nums)
citation = (author_list('AuthorLst') + sentence('Title') + location('Location')
+ date('Date'))
citation.parseString(ntext)
但是,它对“和”放屁,作为作者列表和最后一位作者之间的区别。
我收到错误信息:
---------------------------------------------------------------------------
ParseException Traceback (most recent call last)
<ipython-input-142-5d7946dcb775> in <module>()
15
16
---> 17 citation.parseString(ntext)
/Users/willdampier/anaconda/lib/python2.7/site-packages/pyparsing.pyc in parseString(self, instring, parseAll)
1123 else:
1124 # catch and re-raise exception from here, clears out pyparsing internal stack trace
-> 1125 raise exc
1126 else:
1127 return tokens
ParseException: Expected "and" (at char 40), (line:1, col:41)
有什么建议吗?
最佳答案
定义author
后,添加这一行:
author.setName("author").setDebug()
跟踪 author
表达式的匹配。然后为了获得更好的整体诊断,将您的测试线更改为:
author_list.runTests(ntext)
通过这些更改,您将获得如下输出:
Match author at loc 0(1,1)
Matched author -> ['AuthorA', 'B.']
Match author at loc 12(1,13)
Matched author -> ['AuthorB', 'M.', 'R.']
Match author at loc 28(1,29)
Matched author -> ['AuthorC', 'V.']
Match author at loc 41(1,42)
Exception raised:Expected "," (at char 46), (line:1, col:47)
AuthorA, B., AuthorB, M. R., AuthorC, V., and B. LastAuthor. Some sciency title. Name of the confernce, City, State, December 3, 2012
^
FAIL: Expected "and" (at char 40), (line:1, col:41)
所以您的直接问题是您没有处理“and”之前的尾随“,”。您还需要添加尾随“。”到您对 author_list
的定义。
但是从那里开始,您的 sentence
解析器将出现问题,因为它将处理整个字符串的其余部分。由于您的主要兴趣是获取日期,因此这可能适合您:
stuff = OneOrMore(Word(printables), stopOn=date)
citation = (author_list('AuthorLst') + stuff('body') + date('Date'))
最后,关于您对结果名称的使用(“FirstInitials”、“LastName”等)。好样的,这是一个功能我对 pyparsing 特别满意。但是你需要对每个作者引用文献中的名字进行一些隔离,否则你只会得到最后一位作者的名字。为此,将每个作者包装在一个 pyparsing 组中:
author = Group(family_name("LastName") + Literal(',').suppress() +
OneOrMore(first_init("FirstInitials") ) )
last_author = Group(first_init("FirstInitials") + family_name("LastName"))
现在您的 author_list
应该给您一个子结构列表。如果这样做,您可以看到它们:
print(citation.parseString(ntext).dump())
通过我的更改,我得到了您的示例文本:
[['AuthorA', 'B.'], ['AuthorB', 'M.', 'R.'], ['AuthorC', 'V.'], ',',
['B.', 'LastAuthor'], '.', 'Some', 'sciency', 'title.', 'Name', 'of',
'the', 'confernce,', 'City,', 'State,', 'December', '3', '2012']
- AuthorLst: [['AuthorA', 'B.'], ['AuthorB', 'M.', 'R.'],
['AuthorC', 'V.'], ',', ['B.', 'LastAuthor'], '.']
[0]:
['AuthorA', 'B.']
- FirstInitials: 'B.'
- LastName: 'AuthorA'
[1]:
['AuthorB', 'M.', 'R.']
- FirstInitials: 'R.'
- LastName: 'AuthorB'
[2]:
['AuthorC', 'V.']
- FirstInitials: 'V.'
- LastName: 'AuthorC'
[3]:
,
[4]:
['B.', 'LastAuthor']
- FirstInitials: 'B.'
- LastName: 'LastAuthor'
[5]:
.
仍然需要抑制 ',' 和 '.'标点符号,但这只是清理。然后你就可以轻松地遍历您的作者列表并获取每位作者的姓名。
关于python - PyParsing 书目引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651200/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: template pass by value or const reference or…? 以下对于将函数
我用相同的参数列表重载了一个运算符两次。但返回类型不同: T& operator()(par_list){blablabla} const T& operator()(par_list){bla
假设我有实现接口(interface) I 的 Activity A。我的 ViewModel 类 (VM) 持有对实现接口(interface) I 的对象的引用: class A extends
PHP 如何解释 &$this ?为什么允许? 我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_arr
谁能解释一下下面“&”的作用: class TEST { } $abc =& new TEST(); 我知道这是引用。但是有人可以说明我为什么以及什么时候需要这样的东西吗?或者给我指向一个对此有很好解
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三
目录 引言 背景 结论 引言 我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少
Perl 中的引用是指一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至函数,可以应用在程序的任何地方 创建引用 定义变量的时候,在变量名前面加个 \,就得到了这个变量的一个引用 $sc
我编写了一个将从主脚本加载的 Perl 模块。该模块使用在主脚本中定义的子程序(我不是维护者)。 对于主脚本中的一个子例程,需要扩展,但我不想修补主脚本。相反,我想覆盖我的模块中的函数并保存对原始子例
我花了几个小时试图掌握 F# Quotations,但我遇到了一些障碍。我的要求是从可区分的联合类型中取出简单的函数(只是整数、+、-、/、*)并生成一个表达式树,最终将用于生成 C 代码。我知道使用
很多时候,问题(尤其是那些标记为 regex 的问题)询问验证密码的方法。似乎用户通常会寻求密码验证方法,包括确保密码包含特定字符、匹配特定模式和/或遵守最少字符数。这篇文章旨在帮助用户找到合适的密码
我想通过 MIN 函数内的地址(例如,C800)引用包含文本的最后一个单元格。你能帮忙吗? Sub Set_Formula() ' ----------------------------- Dim
使用常规的 for 循环,我可以做类似的事情: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 常规的 for-
在 Cucumber 中,您定义了定义 BDD 语法的步骤;例如,您的测试可能有: When I navigate to step 3 然后你可以定义一个步骤: When /^I navigate t
这是什么UnaryExpression的目的,以及应该怎样使用? 最佳答案 它需要一个 Expression对象并用另一个 Expression 包裹它.例如,如果您有一个用于 lambda 的表达式
给出以下内容 $("#identifier div:first, #idetifier2").fadeOut(300,function() { // I need to reference jus
我不知道我要找的东西的正确术语,但我要找的是一个完整的引用,可以放在双引号之间的语句,比如 *, node()、@* 以及所有列出的 here加上任何其他存在的。 我链接到的答案提供了一些细节,但还
This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 这是什么? 这是常见问答的集合。这也是一个社区Wi
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
考虑下一个代码: fn get_ref(slice: &'a Vec, f: fn(&'a Vec) -> R) -> R where R: 'a, { f(slice) } fn m
我是一名优秀的程序员,十分优秀!