您好我正在寻找一种使用Regex从Python中提取文本文件的一部分的方法: 这是我的代码:
texfile=open("texte.txt", "r")
for line in texfile:
if re.match("^text(.*)", line):
print line,
我正在搜索单词text之后的文本,直到它到达段落的末尾或者到达空格时,但我的代码只返回单行“text”后面的单词。
例如:
bla bla hhhhhhhh text bla blajjjjjjjjjjjjjjjjjjjjj
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ffff
必须返回:
bla blajjjjjjjjjjjjjjjjjjjjj
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ffff
谢谢我尝试了所有代码,但没有人按我的意愿工作:我现在想要简单地渲染它,提取跟随某个“文本”的流,直到它到达一个空行:
text
sssssssssssssssss
ssssssss
kkkk
lllmmm
kkkk
;must return
sssssssssssssssss
ssssssss
kkkk
lllmmm
;because of the blank line
答案 0 :(得分:1)
如果要检测多行上延伸的文件的一部分,并且文件不是太大,那么通过一次检查一行来限制正则表达式的功能并不是一种特别好的方法。 当文件可以被读取并完全放入RAM中时,最好用正则表达式来分析它,将文本作为一个独特的整体来探索。
请注意'^'
具有重要性“字符串”的开头,如果未使用标记re.MULTILINE
,则“行的开头”如果使用此标志。
顺便说一句,如果您使用match()
方法,则无需在RE模式的开头添加"^"
,因为match()
尝试匹配来自字符串的开头。
所以,这是一种分析整个文本的方式,因为你似乎想要它(我使用splitlines(True)
来获取字符串 ss 中的行列表,这个列表模拟了file°:
import re
ss = """ first line
bli bli hhhhhhhh TEXT bla blajjjjjjjjj
hhhhhhhh VVVVV
ZZZZZZ
tttt
bolo bolo TEXTrumunu and badad
yyyyyyyyyyyyyyyy
kkkkkkkkkkk
jjjjjjjjjjjjjjj
nnnn uytr
poiurrr
ahahahah bobobo
ppppp TEXT aaaabbbbb cccccg
kmsms
TEXT fedex redex bidex
pududadi
A
no-whitespace-before-that
hhrhezipo"""
regx = re.compile('TEXT *(.+(?<! )(?<!\r)(?:\n[^ ]+(?<!\n))?)')
for fnd in regx.findall(ss):
print '\n'.join(map(repr,fnd.splitlines(True)))
print '---------------------------------'
结果:
'bla blajjjjjjjjj\n'
'hhhhhhhh'
---------------------------------
'rumunu and badad\n'
'yyyyyyyyyyyyyyyy\n'
'kkkkkkkkkkk\n'
'jjjjjjjjjjjjjjj'
---------------------------------
'aaaabbbbb cccccg'
---------------------------------
'fedex redex bidex\n'
'pududadi\n'
'A\n'
'\n'
'no-whitespace-before-that'
---------------------------------
如果文件很大且无法在RAM中的一个块中收费,您可以这样做:
import re
ss = """ first line
bli bli hhhhhhhh TEXT bla blajjjjjjjjj
hhhhhhhh VVVVV
ZZZZZZ
tttt
bolo bolo TEXTrumunu and badad
yyyyyyyyyyyyyyyy
kkkkkkkkkkk
jjjjjjjjjjjjjjj
nnnn uytr
poiurrr
ahahahah bobobo
ppppp TEXT aaaabbbbb cccccg
kmsms
TEXT fedex redex bidex
pududadi
A
no-whitespace-before-that
hhrhezipo"""
rigx = re.compile('TEXT *(.+\n?)')
li = []
for line in ss.splitlines(True):
mat = rigx.search(line)
if 'TEXT' in line:
li.append(mat.group(1))
elif ' ' in line and li:
if not line.startswith(' '):
li.append(line.split(' ')[0])
li[-1] = li[-1].rstrip(' \r\n')
print '\n'.join(map(repr,li))
print '====================='
li = []
elif li:
li.append(line)
此代码提供与前一代码相同的结果。 你看它不那么简单了。那是因为大文件更有问题。
答案 1 :(得分:0)
这在python3中适用于我:
for line in texfile:
x = re.search("(.*?)(text)", line)
try:
print (x.group(1))
except:
print(line)
答案 2 :(得分:0)
如果你没有被迫使用正则表达式,你可以使用它......
将文件加载为列表:
with open("texte.txt", "r") as fileInput:
listLines = fileInput.readlines()
获取包含关键字的行的索引,如果它不止一次存在,则可能无法获得预期结果,但这很容易解决:
listIndex = [i for i, item in enumerate(listLines) if "text" in item]
这是您的关键字后面没有空行的行,方法是切换列表:
lines = [line for line in listLines[listIndex[0]:] if line]
您可能希望获得关键字后面的任何文字:
lineMatched = listLines[listIndex].split("text")[1].strip()
&安培;打印结果:
print "\n".join([lineMatched] + lines if lineMatched else lines)