在文件中查找字符串并复制,直到特定字符出现在Python中

时间:2018-09-06 07:56:10

标签: python string file

我有多个.txt文件,其中包含转换后的信息,如下所示:

    >  **   ** **|** **     STYLE #        ** **|** **   DESCR  :  Potrero415;Tbl-
Rnd                 ** **\--------** **         ** **\--** **ZONE  1** **\--**
**           ** **\--** **ZONE  2** **\--** **      ** **\----** **      -T1-
-T2-  -T3-


                ** 

我想抓取从DESCR:到下一行开始的所有内容** **\--** ** ZONE 2 ** 因此我的字符串应如下所示:DESCR : Potrero415;Tbl-Rnd 请注意,在该特定部分之前的文件中,有多行文本,DESCR一词仅出现在我要复制的位置,以前没有其他出现。

我知道在** **\出现之前可以使用拆分 所有文件都具有相同的格式,只需要从DESCR:** **

中查找

我知道我有冒险在这篇文章上投票。 更新: 我设法使用以下方法找到了单词的外观:

lines = test.readlines()
test.close()
for line in lines:
    line = line.strip()
    if line.find("DESCR") != -1:
        print("FOUND")

其中test是我打开的文件

2 个答案:

答案 0 :(得分:1)

听起来像正则表达式的工作。

s是文件的内容。

>>> import re
>>> s = '''    >  **   ** **|** **     STYLE #        ** **|** **   DESCR  :  Potrero415;Tbl-
... Rnd                 ** **\--------** **         ** **\--** **ZONE  1** **\--**
... **           ** **\--** **ZONE  2** **\--** **      ** **\----** **      -T1-
... -T2-  -T3-
... 
... 
...                 ** '''
>>> 
>>> re.search('(DESCR\s*:.*?)\s*\*\* \*\*', s, re.DOTALL).group(1)
'DESCR  :  Potrero415;Tbl-\nRnd'

Demo on regex101

(在正则表达式前加上(?s)与提供re.DOTALL参数具有相同的效果。)

答案 1 :(得分:1)

您可以使用正则表达式

import re

match = re.search('(?=DESCR).*?(?=\*\*)', your_txt)
print(match.group(0))

将输出:

  

DESCR:Potrero415; Tbl-Rnd

Regex Demo with your test string

位置:

Positive Lookahead (?=DESCR)
Assert that the Regex below matches
DESCR matches the characters DESCR literally (case sensitive)
.*? matches any character 
*? Quantifier — Matches between zero and unlimited times, as few times as possible, expanding as needed (lazy)
Positive Lookahead (?=\*\*)
Assert that the Regex below matches
\* matches the character * literally (case sensitive)
\* matches the character * literally (case sensitive)
Global pattern flags
s modifier: single line. Dot matches newline characters