更新更改的字符串:如何为python编写正则表达式,以便它提取一个术语及其定义?

更新更改的字符串:如何为python编写正则表达式,以便它提取一个术语及其定义?,python,regex,parsing,text,Python,Regex,Parsing,Text,更新: 正如你所料,他们改变了软件,所以我的文字也改变了 现在起作用的正则表达式不起作用了。 以下是以前的工作: r“^\”(?P.?)\”指(?P.(?!^\”?“P.?”指)。*)” 使用多行和dotall 我一直在努力把它修好 我认为消极的前瞻性部分正在失败。 我得到了第一个学期,但之后它抓住了一切 谢谢你能提供的帮助 测试字符串: “地址映射表”是指将逻辑块地址与存储在非易失性存储器阵列上的数据的物理地址相关联的数据结构。该表可以实现为索引、映射、b树、内容可寻址存储器(CAM)、二叉树

更新: 正如你所料,他们改变了软件,所以我的文字也改变了

现在起作用的正则表达式不起作用了。 以下是以前的工作: r“^\”(?P.?)\”指(?P.(?!^\”?“P.?”指)。*)” 使用多行和dotall

我一直在努力把它修好

我认为消极的前瞻性部分正在失败。 我得到了第一个学期,但之后它抓住了一切

谢谢你能提供的帮助

测试字符串: “地址映射表”是指将逻辑块地址与存储在非易失性存储器阵列上的数据的物理地址相关联的数据结构。该表可以实现为索引、映射、b树、内容可寻址存储器(CAM)、二叉树和/或哈希表等。地址映射表可以互换地称为组分配表(GAT)

“非对称存储介质”是指对于不同的存储操作具有不同延迟的存储介质。许多类型的固态存储介质(例如,存储器芯片)是不对称的;例如,读取操作可能比写入/编程操作快得多,写入/编程操作可能比擦除操作快得多(例如,读取存储介质可能比擦除快几百倍,比编程存储介质快几十倍)


“位线”是指配置为向存储器阵列的列传送电压和/或传导电流的电路结构。在一个实施例中,列包括NAND字符串或存储器字符串,并且还可以称为信道。在一个实施例中,列被称为NAND字符串,并且NAND字符串包括信道。在一个实施例中,位线连接到NAND字符串漏极端或漏极侧的NAND字符串。一个内存阵列可能有一个沿内存阵列字线的每个内存单元的位线。

我有可能使正则表达式过于复杂,但下面是:

regex = re.compile(
    r"^\"(?P<term>[^\"]*?)\" refers to (?P<def>(?:(?!^\"[^\"]*?\" refers to ).)*)",
    re.MULTILINE | re.DOTALL)
输出:

(请注意,我只打印了定义的一个片段,但完整的定义是匹配的)

正则表达式解释 重新编译的标志:

  • :使
    ^
    $
    分别与行首和行尾匹配;默认值是匹配整个字符串的开头/结尾,这是我们不希望看到的
  • :使
    也与换行符匹配;我们需要它来匹配多行定义
所有的问号是什么

  • *?
    :默认情况下,
    *
    异常贪婪;问号使它成为现实

    “”、“+”和“?”限定符都是贪婪的;他们也很般配 尽可能多的文本。有时这种行为是不可取的;如果 与b匹配,它将匹配整个字符串, 不仅如此。添加?在限定符使其执行 以非贪婪或最小的方式匹配;尽可能少的字符 将匹配。使用RE将仅匹配

  • (?p…)
    :表示一个“捕获组”,以便我们以后可以按名称捕获匹配的位——这不是必需的,但我发现使用它更容易

  • (?:…)
    :表示“非捕获组”;这只是意味着我需要用括号括起一些正则表达式,但我不希望它被当作自己的组来对待

  • (?!…)
    :其中最复杂的部分--“表达式”。这意味着匹配的文本不应包含封闭的正则表达式。这将阻止定义匹配继续到下一个术语

  • 把它放在一起:
    (?!^\“*?\”指)。)*)
    表示匹配任何字符的零个或多个,除非字符以
    开头“${some term}指“


您试图将引号中的字符串作为主题,然后将非引号部分作为定义?开始和结束双引号是否实际上是示例字符串的一部分?正确,引号中的字符串是“术语”,而“引用a”之后的文本是“定义”。开始引号和结束引号不是示例字符串的一部分-我只包含它们来标识示例字符串。首先,您的问题是一个需要解决的有趣正则表达式,因此感谢您的挑战!在StackOverflow上提问的友好提示:如果有人发现这个问题,我建议用最少数量的示例来编辑你的问题(它们不必是真实的定义,只需显示所有用例;例如多行、引号等),很少有stackoverflow用户会浏览您添加到问题中的示例页面。在该文本上使用引号格式按钮也会有所帮助。谢谢你的及时回复。我认为您提供的正则表达式字符串可以完成这项工作(凌乱而复杂,但如果它可以完成这项工作,我也同意)。我真的很喜欢regex 101网站,我感谢你对regex的有益解释。我会做更多的测试,但我希望能把这个标记为回答我的问题。这个答案非常有用。我感谢你的解释。我想我可能需要做一些类似于“消极前瞻”的事情,但不知道怎么做。我完成了测试,效果很好。同时感谢regex101.com网站的提示。戴夫。
# show what it matches:
for m in regex.finditer(contents):
    groups = m.groupdict()
    print("term: %s" % groups["term"])
    print("%s" % ("-" * 60)) # make it clear where the term ends
    d = groups["def"].strip() # regex includes blank lines
    print("%s [...] %s" % (d[:20], d[-20:])) # definitions are too long to print
    print("\n%s\n" % ("=" * 60))
term: Adjacent word line
------------------------------------------------------------
a word line physical [...] r a coupling effect.

============================================================

term: Bit line
------------------------------------------------------------
a circuit structure  [...] of the memory array.

============================================================

term: Bit line compensation voltage
------------------------------------------------------------
a voltage supplied t [...]  line is programmed.

============================================================