gpt4 book ai didi

python - 可以使 re.finditer() 从组中排除分隔符吗?

转载 作者:行者123 更新时间:2023-12-01 06:56:23 26 4
gpt4 key购买 nike

我的任务是将“源”文本转换为元素序列:TEXTINPUTINPUT 是包裹在两个星号中的部分,而 TEXT 是其他所有内容。

这是一个例子:

>>> source = 'I came *across* these old photos when I *was* tidying the closet.'
>>> parse(source)
TEXT: 'I came '
INPUT: 'across'
TEXT: ' these old photos when I '
INPUT: 'was'
TEXT: ' tidying the closet.'

这种解析的目的是创建一个用于语言训练的“填空式”交互工具。解析后的元素最终将到达客户端,其中 TEXT 元素“按原样”显示,而 INPUT 元素则显示为输入字段以供用户输入。

为了实现这一点,我稍微修改了 Writing a Tokenizer 中给出的示例。 re库文档的部分。这是我的解决方案:

def parse(text):
token_specifications = [
('INPUT', r'(\*\w\*)|(\*\w+[^*]*\w+\*)'),
('TEXT', r'[^*]+'),
]
token_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specifications)
elements = []
for mo in re.finditer(token_regex, text):
kind = mo.lastgroup
value = mo.group()
# A hack to remove the delimiters
if kind == 'INPUT':
value = value.replace('*', '')
print("%s: '%s'" % (kind, value))
elements.append((kind, value))
# Testing the result
if elements != [
('INPUT', 'This'),
('TEXT', ' is '),
('INPUT', 'a'),
('TEXT', ' text that '),
('INPUT', 'needs to be'),
('TEXT', ' parsed. '),
('INPUT', 'Highlighted'),
('TEXT', ' elements must be in '),
('INPUT', 'INPUT'),
('TEXT', ' group.'),
]:
raise Exception("Parsing result is wrong!")

text = '*This* is *a* text that *needs to be* parsed. *Highlighted* elements must be in *INPUT* group.'
parse(text)

它按预期工作,并且看起来足够整洁,除了一个小问题。也就是说,INPUT 元素与星号组合在一起,我必须显式地将它们删除(请参阅删除代码的分隔符 部分的技巧)。

有没有办法让 finditer() 函数丢弃分隔符,这样我就不必显式地这样做?

此外,如果有任何其他技巧可以使我的代码更加优雅,我们非常欢迎。

最佳答案

您可以简化您的REGEX和您的代码:

text = '*This* is *a* text that *needs to be* parsed. *Highlighted* elements must be in *INPUT* group.'
elements = []
token_specifications = [
('INPUT', r'\*(?P<{}>\w+(?:[^*]\w+)*)\*'),
('TEXT', r'(?P<{}>[^*]+)'),
]
token_regex = '|'.join(exp.format(k) for k, exp in token_specifications)
# for match in re.finditer(r'\*(?P<INPUT>[^*]+)\*|(?P<TEXT>[^*]+)', text):
for match in re.finditer(token_regex, text):
kind = match.lastgroup
value = match.group(kind)
elements.append((kind, value))

print(elements)
# [('INPUT', 'This'), ('TEXT', ' is '), ('INPUT', 'a'), ('TEXT', ' text that '), ('INPUT', 'needs to be'),
# ('TEXT', ' parsed. '), ('INPUT', 'Highlighted'), ('TEXT', ' elements must be in '), ('INPUT', 'INPUT'), ('TEXT', ' group.')]

我将像这样的 INPUT 正则表达式 \*(\w+(?:[^*]*\w+)*)\* 与一个不支持的捕获组组合在一起不包括*。然后您可以按名称获取捕获的组,如下所示:match.group('NAME_OF_GROUP')

关于python - 可以使 re.finditer() 从组中排除分隔符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com