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

更新:如您所料,他们更改了软件,因此我的文字也更改了。

现在有效的正则表达式无效。这是以前的工作方式:r“ ^ \”(?P。?)\“表示(?P(?:(?!^ \”。?\“表示)。)*)”使用多行和dotall。

我一直在努力将其修复在https://regex101.com/上。

我认为负面的前瞻性失败。我得到了第一学期,但随后便掌握了所有内容。

感谢您提供的任何帮助。

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

“非对称存储介质”是指对于不同的存储操作具有不同的等待时间的存储介质。许多类型的固态存储介质(例如,存储器管芯)是不对称的。例如,读操作可能比写/编程操作快得多,并且写/编程操作可能比擦除操作快得多(例如,读取存储介质可能比擦除快数百倍,并且速度比对存储介质进行编程要快)。

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

1
投票

我可能使正则表达式复杂化,但是这里有:

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

((如果您想与之交互使用,可以在regex 101尝试一下)

# 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))

输出:

((请注意,我只打印了定义的摘录,但是完整的def被匹配了)

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.

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

正则表达式说明

re.compile的标志:

re.MULTILINE:使 re.MULTILINE^分别与行的开头和结尾匹配;默认值是匹配整个字符串的开头/结尾,我们不希望这样 $:使 re.DOTALL也与换行符匹配;我们需要它来匹配多行定义

所有问号是什么:

re.DOTALL:默认情况下,.非常贪婪;问号使其成为.*?

”,“ +”和“?”限定词都是贪婪的;他们尽可能地匹配文字。有时这种行为是不希望的;如果有>与b匹配,它将匹配整个字符串,而不仅仅是。加上?限定词使其执行后以非贪婪或极少的方式进行匹配;尽可能少的字符将被匹配。使用RE 仅匹配。

.*:表示一个“捕获组”,以便我们以后可以按名称抓取此匹配的位-不必要,但是我发现使用起来更容易。

not greedy:表示“非捕获组”;这只是意味着我需要在括号中包装一些正则表达式,但我不希望将其视为自己的组。

(?P<name>...):此过程中最复杂的部分---“ (?:...)”表达式。这意味着匹配的文本应not

包含随附的正则表达式。这样可以防止定义匹配继续到下一项。

放在一起:(?!...)表示要匹配零个或多个任何字符,除非

字符以 negative lookahead]