Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回正则表达式语句实例之间的子字符串列表_Python_Regex_Nltk - Fatal编程技术网

Python 返回正则表达式语句实例之间的子字符串列表

Python 返回正则表达式语句实例之间的子字符串列表,python,regex,nltk,Python,Regex,Nltk,我正在为一个NLP问题预处理《詹姆斯王圣经》,并希望检索以下格式的诗句列表: “XX:XX诗文” NLTK中包含的Gutenberg KJV语料库项目已经有了这样的诗句格式,但我正在努力将它们提取为子字符串 我试图构造一个正则表达式语句来提取这些子字符串,但我得到的只是韵文标签(参见代码) 我希望从我的代码中收到如下列表: ['1:1起初,上帝创造了天地, “地是虚空的,没有形状;深渊的表面是黑暗的。神的灵在水面上移动。”,……等等 相反,我得到的是这样的列表: ['1:1'、'1:2'、…等]

我正在为一个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)