re.search 多行 Python

Posted

技术标签:

【中文标题】re.search 多行 Python【英文标题】:re.search Multiple lines Python 【发布时间】:2013-09-02 11:58:55 【问题描述】:

re.search 用 \s 或 '\n' 没有找到我要搜索的多行。

部分来源:

Date/Time:
2013-08-27 17:05:36 

----- BEGIN SEARCH -----

GENERAL DATA:
NAME:   AB12
SECTOR: 
999,999
CONTROLLED BY:  Player
ALLIANCE:   Aliance
ONLINE: 1 seconds ago
SIZE:   Large
HOMEWORLD:  NO
APPROVAL RATING:    100%
PRODUCTION RATE:    100%

RESOURCE DATA:
POWER:  0 / 0
BUILDINGS:  0 / 20
ORE:    80,000 / 80,000
CRYSTAL:    80,000 / 80,000
POPULATION: 40,000 / 40,000

BUILDING DATA:
N/A

UNIT DATA:
WYVERN(S):  100

----- END SEARCH -----

在 Notepad++ 中查看它,我看到“BUILDING DATA:(LF)”

完整代码

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1

但我没有返回任何东西。

当“BUILDING DATA:”之后“DEFENSE GRID”不存在时,我需要放入一个空的分隔符

我知道我遗漏了一些东西,我已经尝试阅读 re.search,但我无法找到任何解释多行如何工作的完整示例。

【问题讨论】:

一个sscce 会很好。很难弄清楚到底是什么问题.. 我想你忘了'import re',这个例子不能开箱即用。日期未定义... 【参考方案1】:
re.findall("BUILDING DATA:\nN/A",a,re.MULTILINE)

【讨论】:

【参考方案2】:

你可以做你所做的,但是使用re.findall而不是re.search

re.findall('BUILDING DATA:\nN/A', a, re.M)
#['BUILDING DATA:\nN/A']

编辑:

问题是您当前正在逐行阅读。为了检测属于两行或多行的模式,您必须将字符串视为一个整体,也许这样做:

s = ''.join(lines)

如果lines 不是那么大也可以,然后使用s 执行多行搜索...

【讨论】:

我添加了更多我正在做的事情。 re.findall 似乎没有帮助。 大声笑,我认为这只是我的一个简单的语法错误......决定添加其余部分来解释我如何尝试使用它...... @Xariec 我添加了一个解释,这似乎是您问题的根本原因...... 我想知道为什么必须使用 readline ... file.read() 可以完成这项工作,并且不需要“for a in lines”。【参考方案3】:

我想知道你为什么没有返回任何东西。如果您的文件如下所示:

BUILDING DATA:
N/A

我开始使用

import re
f = open('test.txt','r')
a = f.read(20)
re.search('BUILDING DATA:\nN/A', a, re.M)

输出。这是

<_sre.SRE_Match object at 0x1004fc8b8>

如果我用字符串测试 re.search,那么文件中就没有这个代码:

import re
f = open('test.txt','r')
a = f.read(20)
re.search('BUILDING BATA:\nN/A', a, re.M)

没有预期的输出。

编辑:

正如 Saullo Castro 所指出的,问题在于逐行阅读。为什么不使用这样的东西?

a = open('scan.txt','r').read()
if re.findall('BUILDING DATA:\nN/A', a, re.M):
     print('found!')

第三次尝试:

tmp = False
...
elif re.findall('BUILDING DATA:', a, re.M):
    tmp = True
elif tmp and re.findall('N/A', a, re.M):
    def_grid = ''
    print "Didn't find it"
    defense.append(def_grid)
    defense_count +=1

【讨论】:

是的,您写道,在记事本中的文本看起来不像您发布的那样。您是否尝试过搜索“建筑数据:(LF)\nN/A”?在我看来,由于编码存在一些问题。 +1 使用.read() 的好处,但在 OP 的算法结构上它可能不起作用,但这绝对是比''.join(lines) 阅读它们后更好的方法......跨度> 嗯.... 我正在阅读该行,因为我需要将部分行拉出并将它们放入列表中,并且我需要该行的位置。此外,我正在解决一种情况,其中(有时它的建筑数据:\nN/A,有时它包括防御网格)将所有内容插入数据库以供以后使用。需要保持密钥一致,所以我需要计算它不存在的时间以及它存在的时间。 啊,对不起,这个我没明白。好的...我想像 'elif re.search('BUILDING DATA:', a, re.M): if re.search('N/A', , re.M)' @Xariec:这肯定会更优雅,但我的编辑(第三次尝试)是否可以解决您的问题?【参考方案4】:

替换

re.findall('BUILDING DATA:\sN/A', a, re.M):

re.findall('BUILDING DATA:\nN/A', a, re.M):

re.search(r'BUILDING DATA:\nN/A', a, re.M):

它应该可以工作。

(请注意,您的代码中有 \s 而不是 \n

【讨论】:

以上是关于re.search 多行 Python的主要内容,如果未能解决你的问题,请参考以下文章

re模块之research

python正则表达式匹配多行

史上最全python面试题详解 (附带详细答案(关注持续更新))

Python中正则表达式太长,如何换行?

Python re.search和re.findall的比较

re.match re.search re.findall区别