Python 返回正则表达式语句实例之间的子字符串列表
我正在为一个NLP问题预处理《詹姆斯王圣经》,并希望检索以下格式的诗句列表: “XX:XX诗文” NLTK中包含的Gutenberg KJV语料库项目已经有了这样的诗句格式,但我正在努力将它们提取为子字符串 我试图构造一个正则表达式语句来提取这些子字符串,但我得到的只是韵文标签(参见代码) 我希望从我的代码中收到如下列表: ['1:1起初,上帝创造了天地, “地是虚空的,没有形状;深渊的表面是黑暗的。神的灵在水面上移动。”,……等等 相反,我得到的是这样的列表: ['1:1'、'1:2'、…等]Python 返回正则表达式语句实例之间的子字符串列表,python,regex,nltk,Python,Regex,Nltk,我正在为一个NLP问题预处理《詹姆斯王圣经》,并希望检索以下格式的诗句列表: “XX:XX诗文” NLTK中包含的Gutenberg KJV语料库项目已经有了这样的诗句格式,但我正在努力将它们提取为子字符串 我试图构造一个正则表达式语句来提取这些子字符串,但我得到的只是韵文标签(参见代码) 我希望从我的代码中收到如下列表: ['1:1起初,上帝创造了天地, “地是虚空的,没有形状;深渊的表面是黑暗的。神的灵在水面上移动。”,……等等 相反,我得到的是这样的列表: ['1:1'、'1:2'、…等]
非常感谢您抽出时间!这对我来说很有用:
import re
from nltk.corpus import gutenberg
kjv = gutenberg.raw('bible-kjv.txt')
pattern = re.compile(r"(\d+:\d+.*?)\n\n", re.MULTILINE | re.DOTALL)
res = pattern.findall(kjv)
我更改了正则表达式,以便它可以找到“X:X”,然后在找到两个连续的换行符(\n\n
)之前找到尽可能少的字符,这是如何分隔韵文的。要切换到所谓的“非贪婪”正则表达式限定符,只需在其后附加一个?
,例如c*?
(找到尽可能少的连续c,包括一个也没有)
我还预先编译了正则表达式,以提高搜索长文本时的性能,即使增益很小。有些诗句跨越多行,因此我必须设置多行
和DOTALL
标志。前者允许正则表达式使用多行,而后者允许
标记pture换行符,通常不会。仅供参考:这是一个很好的地方,可以尝试正则表达式并获得关于您正在做什么的文本解释。在您的示例中,我非常确定[^(\d+:\d+)]
没有做您期望它做的事情。这与[^()\d+:]相同
因为它是一组无序的字符。此外,将正则表达式放入原始字符串(r'(my)?Regex'
)是一种很好的做法,请参见中的第三段。此外,删除括号内文本的第一个正则表达式看起来过于复杂。您可以使用r'\[.\]'
。
import re
from nltk.corpus import gutenberg
kjv = gutenberg.raw('bible-kjv.txt')
pattern = re.compile(r"(\d+:\d+.*?)\n\n", re.MULTILINE | re.DOTALL)
res = pattern.findall(kjv)