![](/img/trans.png)
[英]How can I extract URLs from a one line JSON text file using regex?
[英]How can I extract text from a file using 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
如果要檢測文件擴展成幾行的一部分,並且文件不是太大,那么通過一次檢查一行來限制正則表達式的功能不是一個特別好的方法。 當可以讀取文件並將其完全放入RAM時,最好使用正則表達式對文件進行分析,以將文本視為一個唯一的整體。
請注意,如果不使用標志re.MULTILINE
,則'^'
含義為“字符串的開頭” ,而如果使用此標志,則其re.MULTILINE
為“行的開頭” 。
順便說一句,如果使用match()
方法,則不需要在RE模式的開頭添加"^"
,因為match()
嘗試從字符串的最開始進行匹配。
因此,這是一種分析整個文本的方式(我使用splitlines(True)
來獲取字符串ss splitlines(True)
的列表,該列表模擬了一個文件°:
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)
此代碼與前一個代碼具有相同的結果。 您會發現它不那么簡單。 那是因為大文件更大的問題。
這在python3中對我有用:
for line in texfile:
x = re.search("(.*?)(text)", line)
try:
print (x.group(1))
except:
print(line)
如果您不被迫使用正則表達式,則可以使用此...
將該文件作為列表加載:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.