首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从模式中解析出元素

从模式中解析出元素
EN

Stack Overflow用户
提问于 2011-11-22 07:27:18
回答 3查看 174关注 0票数 2

我正在尝试解析来自自然语言解析器(Stanford解析器)的结果输出。部分结果如下:

代码语言:javascript
复制
dep(Company-1, rent-5')
conj_or(rent-5, share-10)
amod(information-12, personal-11)
prep_about(rent-5, you-14)
amod(companies-20, non-affiliated-19)
aux(provide-23, to-22)
xcomp(you-14, provide-23)
dobj(provide-23, products-24)
aux(requested-29, 've-28)

我想要得到的结果是:

代码语言:javascript
复制
['dep', 'Company', 'rent']
['conj_or', 'rent', 'share']
['amod', 'information', 'personal']
...
['amod', 'companies', 'non-affiliated']
...
['aux', 'requested', "'ve"]

首先,我尝试直接获取这些元素,但失败了。然后我意识到正则表达式应该是正确的发展方向。

但是,我对regex完全不熟悉。通过一些探索,我得到了:

代码语言:javascript
复制
m = re.search('(?<=())\w+', line)
m2 =re.search('(?<=-)\d', line)

然后卡住了。

第一个可以正确地获取第一个元素,例如'dep''amod''conj_or',但我实际上还没有完全弄清楚它为什么会工作……

第二行是尝试获取第二个元素,例如'Company''rent''information',但我只能获取单词后面的数字。我不知道怎么往前看而不是往后看……

顺便说一句,我也不知道如何处理像'non-affiliated'"'ve"这样的异常。

有人能给点提示或帮助吗。非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-22 07:37:26

在不知道可能输出的全部范围的情况下,很难给出最佳答案,然而,这里有一个可能的解决方案:

代码语言:javascript
复制
>>> [re.findall(r'[A-Za-z_\'-]+[^-\d\(\)\']', line) for line in s.split('\n')]
[['dep', 'Company', 'rent'], 
 ['conj_or', 'rent', 'share'], 
 ['amod', 'information', 'personal'], 
 ['prep_about', 'rent', 'you'], 
 ['amod', 'companies', 'non-affiliated'], 
 ['aux', 'provide', 'to'], 
 ['xcomp', 'you', 'provide'], 
 ['dobj', 'provide', 'products'], 
 ['aux', 'requested', "'ve"]]

它的工作原理是找到同一行中的所有连续字母组([A-Za-z]表示大写A和Z之间的间隔以及小写a和z之间的间隔)或字符"_“和"'”。

此外,它还强制执行一个规则,即匹配的字符串不得在最后位置具有给定的字符列表([^...]是表示“不得包含任何字符(用字符列表替换"...”)“的语法)。

字符\对"(“或")”等字符进行转义,否则正则表达式引擎会将这些字符解析为指令。

最后,s是您在问题中给出的示例字符串...

哈!

票数 1
EN

Stack Overflow用户

发布于 2011-11-22 07:36:43

下面是你要找的东西:([\w-]*)\(([\w-]*)-\d*, ([\w-]*)-\d*\)

[\w-]*周围的括号用于分组,以便您可以通过以下方式访问数据:

代码语言:javascript
复制
ex = r'([\w-]*)\(([\w-]*)-\d*, ([\w-]*)-\d*\)'
m = re.match(ex, line)
print(m.group(0), m.group(1), m.group(2))

顺便说一句,我推荐使用Python+PyQT编写的"Kodos“程序来学习和测试正则表达式。它是我最喜欢的测试正则表达式的工具。

票数 1
EN

Stack Overflow用户

发布于 2011-11-22 09:10:57

如果解析器的结果像建议的那样规则,那么正则表达式可能不是必需的:

代码语言:javascript
复制
from pprint import pprint

source = """
dep(Company-1, rent-5')
conj_or(rent-5, share-10)
amod(information-12, personal-11)
prep_about(rent-5, you-14)
amod(companies-20, non-affiliated-19)
aux(provide-23, to-22)
xcomp(you-14, provide-23)
dobj(provide-23, products-24)
aux(requested-29, 've-28)
"""

items = []

for line in source.splitlines():
    head, sep, tail = line.partition('(')
    if head:
        item = [head]
        head, sep, tail = tail.strip('()').partition(', ')
        item.append(head.rpartition('-')[0])
        item.append(tail.rpartition('-')[0])
        items.append(item)

pprint(items)

输出:

代码语言:javascript
复制
[['dep', 'Company', 'rent'],
 ['conj_or', 'rent', 'share'],
 ['amod', 'information', 'personal'],
 ['prep_about', 'rent', 'you'],
 ['amod', 'companies', 'non-affiliated'],
 ['aux', 'provide', 'to'],
 ['xcomp', 'you', 'provide'],
 ['dobj', 'provide', 'products'],
 ['aux', 'requested', "'ve"]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8220007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档