- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是将“源”文本转换为元素序列:TEXT
和 INPUT
。 INPUT
是包裹在两个星号中的部分,而 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/
我正在使用 skimage.feature.greycomatrix 来计算图像的 GLCM(灰度共现矩阵),但是当我使用时: from skimage.feature import greycoma
假设我有一个字符串 abbb。我正在尝试使用正则表达式打印以下模式: a ab abb abbb 我尝试这样做: import re line = "abbb" m = re.finditer('ab
例如,我有以下字符串。 input = "a b c d e f 1 2 3 4" 我有以下正则表达式代码。 input = re.sub(r"([0-9])\s+([0-9])", "\1\2",
我想获取span中的元组和macht的str,但我不知道如何访问这个对象,文档中的方法不起作用 import re s = 'sd(asdf(xf))fg' if re.findall('\([A-z
我制作了此模式来获取博客文章的 url 链接(可以在我的网站 url 中用连字符或下划线等分隔,以将其与数据库匹配并显示相应的帖子)。每当我将匹配项附加到列表中时,它们都是重新匹配对象。如何获取匹配的
一个。下面的代码是否会导致 断言错误? 如果是这样,我该如何预防? def finditer_test(pattern, string, flags=0): for match_object
我正在尝试从 Instagram API 获取电子邮件、whatzapp、viber。我将下载的数据存储到一个名为 text 的变量中,并检查电子邮件、watzapp、viber 号码等的模式。 示例
我有一个有点复杂的正则表达式,我试图将其与一个长字符串(65,535 个字符)进行匹配。我正在寻找字符串中多次出现的 re,因此我使用了 finditer。它有效,但由于某种原因它在识别前几次出现后挂
有没有办法将 re.findall 或更好的 re.finditer 功能应用于流(即打开文件句柄以供读取)? 请注意,我不是假设要匹配的模式完全包含在一行输入中(即允许多行模式)。我也不假设最大匹配
我在使用 python 中的 re.finditer() 方法时遇到了一些问题。例如: >>>sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcct
这个问题在这里已经有了答案: Why can't I iterate twice over the same iterator? How can I "reset" the iterator or
这个问题在这里已经有了答案: Why can't I iterate twice over the same iterator? How can I "reset" the iterator or
我一直在用 python 制作一个简单的着色器。它使用 re.finditer 查找引号之间的所有单词的索引,并在 tkinter 文本框中为这些单词着色。由于某种原因,当盒子打开时,并没有找到所有的
我的字符串是文字记录,我想捕获说话者,特别是他们的第二个名字(仅在完全大写时才需要匹配)此外,我想匹配他们的演讲,直到下一个演讲者开始,我想最终在一个巨大的文本文件上循环这个过程。 问题是匹配仅返回一
我的任务是将“源”文本转换为元素序列:TEXT 和 INPUT。 INPUT 是包裹在两个星号中的部分,而 TEXT 是其他所有内容。 这是一个例子: >>> source = 'I came *ac
我想知道如何通过索引导航由 finditer 正则表达式操作生成的对象。 我的字符串是s = "fish oil X22 stack peanut C4" 这是我的代码: import re word
如果 findall() 足够好,使用 finditer() 有什么好处?findall() 返回所有匹配项,而 finditer() 返回不能像静态列表那样直接处理的匹配对象。 例如: import
有没有办法像使用 findall 那样将不同 finditer 的结果相加?例如: matches = re.finditer(pattern_1, text) + re.finditer(patte
我有以下字符串: '3 4 4 5 5 5 2 2' 我需要像这样从中提取所有连续出现的事件: '44 555 22' 为此,我使用了以下代码。它工作正常: n = input().replace('
我正在使用 Python(实际上是 pl/python)在一个非常大的文本对象中连续查找一系列正则表达式匹配项。这工作正常!每次匹配都是不同的结果,每次替换都会是不同的结果,最终基于循环内的查询。 目
我是一名优秀的程序员,十分优秀!