当前位置: 首页 > 知识库问答 >
问题:

正则表达式解析带有引号子字符串的查询并返回单个单词的嵌套列表

羊舌庆
2023-03-14

我正在尝试编写一个正则表达式,它接受一个字符串,该字符串包含带引号的子字符串,如“绿色蜥蜴”like to sit“in the sun”,将其标记为用空格分隔的单词和带引号的字符串(使用单引号或双引号),然后返回一个列表[[绿色','蜥蜴'],'喜欢','到','坐',['in','the','sun']]其中列表项是单个单词或嵌套的单词列表,其中遇到了带引号的子字符串。

我是正则表达式的新手,并且能够找到一个捕获引用部分的解决方案:re.findall('“([^”]*)“', '”绿色蜥蜴“喜欢坐在”阳光下“)...返回:[“绿色蜥蜴”,“在阳光下”]

但这不会捕获单个单词,也不会标记它们(返回单个字符串而不是单词列表,这需要我分别<code>split()</code>。

我将如何制作一个正确返回我想要的列表类型的正则表达式?此外,如果有人有建议,我愿意使用比正则表达式更好的方法/工具来解析这些类型的字符串。

谢谢你!

共有3个答案

巫墨一
2023-03-14

您可以使用< code>re.split和最后的< code>str.split:

import re
s = '"green lizards" like to sit "in the sun"'
new_s = [[i[1:-1].split()] if i.startswith('"') else i.split() for i in re.split('(?<=")\s|\s(?=")', s)]
last_result = [i for b in new_s for i in b]

输出:

[['green', 'lizards'], 'like', 'to', 'sit', ['in', 'the', 'sun']]
简意
2023-03-14

另一种方法(支持单引号和双引号):

import re

sentence = """"green lizards" like to sit "in the sun" and 'single quotes' remain alone"""

rx = re.compile(r"""(['"])(.*?)\1|\S+""")

tokens = [m.group(2).split() 
            if m.group(2) else m.group(0) 
            for m in rx.finditer(sentence)]
print(tokens)

屈服

[['green', 'lizards'], 'like', 'to', 'sit', ['in', 'the', 'sun'], 'and', ['single', 'quotes'], 'remain', 'alone']
(['"]) # capture a single or a double quote
(.*?)  # 0+ characters lazily
\1     # up to the same type of quote previously captured
|      # ...or...
\S+    # not a whitespace

在列表理解中,我们检查哪个条件被满足。

全彬
2023-03-14

使用re.findall()函数和内置的str方法:

import re

s = '"green lizards" like to sit "in the sun"'
result = [i.replace('"', "").split() if i.startswith('"') else i
          for i in re.findall(r'"[^"]+"|\S+', s)]

print(result)

输出:

[['green', 'lizards'], 'like', 'to', 'sit', ['in', 'the', 'sun']]
 类似资料:
  • 我想写一个正则表达式(C#),可以匹配没有引号的单词。输入字符串示例如下: dbo.testline_length"引用的话"不引用 这个需要匹配 dbo.test line_length 无报价 因此,3个单独的匹配和“引用的单词”不匹配。引用的短语可能在输入中的任何地方。。。开头、中间、结尾等。 我还没能想出一个正则表达式来匹配不在引号中的单词,引号中可能有空格。。。我已经能够匹配一些东西,比

  • 我使用此模式在解析器中匹配单引号字符串: 但是我需要正则表达式,它可以找到带有 postgres 的单引号字符串,例如 bied of single qoutes(加倍单个 qoutes)。需要匹配这样的东西: 我想为以单引号开头和结尾的字符串找到最短的匹配项,因此上面的字符串意味着 3 个子字符串:

  • 我正在编写一个正则表达式来解析包含标记字段的行。标签出现在等号之前,内容出现在等号之后,用单引号或双引号括起来。对于大多数字段,内容都用单引号括起来。如果字段的内容包含单引号,则该字段用双引号括起来。例如: 我的正则表达式有效,除非字段用双引号括起来。 在Debuggex中测试 在Regexr中测试 对于上面示例中标记为a的字段,a=“'D08/APPL'”,a由捕获组1匹配,后面的单引号由捕获组

  • 我面临一个挑战,要以以下格式匹配输入: 输入由key=value对组成。关键字以斜杠开头。值可以是数字或引号中的字符串。 该值可以选择性地包含转义引号,即引号后面跟着引号(“”)。这种转义引号应该被视为价值的一部分。不需要检查转义引号是否平衡(例如,由另一个转义引号结束)。 正则表达式应该匹配序列中给定的key=value部分,并且对于长输入(例如value是10000个字符)不应该中断。

  • 这是我之前问题的后续。我意识到我需要更具体地说明我的regex案例,以获得适用于我的案例的答案。 我已经与这个正则表达式斗争了很长一段时间(也使用我上一个问题的答案),我似乎无法构建我需要的东西。 我需要将所有字符串中出现的两个重复出现的单引号替换为(因此字符串内部意味着单引号)。这是因为在一种语言(语法)中,字符串中的引号使用<code>‘转义。 这里有一个例子(实际的例子可以包含用< code

  • 我正在创建一个单词替换脚本。我遇到了一个路障,忽略引号之间的字符串,并且在这里找不到一个不涉及正则表达式的体面解决方案。 我有一个工作片段,它循环遍历字符串中的每个字符,并计算出最近的报价是开始报价还是结束报价(无论是单引号还是双引号),并忽略转义报价。问题是,为了提供100%准确的体验,它必须在每次字符串更改时运行(由于它的工作方式,它可以在单个函数中更改60K次),并且由于字符串长度的可能性,