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

时间:2019-04-25 19:06:50

标签: python regex nltk

我正在为解决NLP问题而对《国王詹姆斯圣经》进行预处理,并希望检索以下格式的经文列表: “ XX:XX经文”

NLTK中包含的Gutenberg KJV语料库项目的经文格式已经如此,但是我一直在努力将其提取为子字符串。

我试图构造一个正则表达式语句来提取这些子字符串,但我得到的只是诗句标签(参见代码)。

from nltk.corpus import gutenberg, stopwords
kjv = gutenberg.raw('bible-kjv.txt')

# Get rid of bracketed text
pattern = "[\[].*?[\]]"
kjv = re.sub(pattern, "", kjv)

# Define a regex statement that's supposed to match
# verses in following format: "XX:XX Text of verse"
between_verses = '(\d+:\d+).*[^(\d+:\d+)]*'
result = re.findall(between_verses,kjv[0:500])

print(result)

我希望从我的代码中收到这样的列表:

['1:1起初,上帝创造了天地。“  '1:2地没有空,没有空。黑暗笼罩着深处。神的灵在水面上移动。',...等]

相反,我将返回如下列表:

['1:1','1:2',...等等。

非常感谢您的时间!

1 个答案:

答案 0 :(得分:0)

这对我有用:

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)

我更改了正则表达式,以便在找到两个连续的换行符(\n\n)之前先找到'X:X',然后找到尽可能少的字符,这就是经文是定界的。要切换到所谓的“非贪婪”正则表达式限定词,只需在其后附加一个?,例如c*?(找到尽可能少的连续c,包括一个都没有)。

我也预先编译了正则表达式以提高搜索长文本时的性能,即使增益很小。有些经文跨越多行,因此我不得不设置MULTILINEDOTALL标志。前者让正则表达式消耗多行,而后者让.捕获换行符,而通常不会。