2016-12-27 52 views
-1

我有一个看起来像这样一个文本:Python的正则表达式提前

TTL1 | TTL2 | TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
TTL1 | TTL2 | 
TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4 
some text in a line5 
TTL1 | TTL2 | TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4 
... 

说明:我有时可分隔为多行标题行,然后我有很多的其他线路。 我想要捕捉所有标题(即使它们处于不同的行中),并且还要在一个组中捕捉标题之后的所有行。

我有多行标题和多行内容truoble,我不知道如何提取它与正则表达式和python。

和想法请吗?

+0

试大熊猫。 http://pandas.pydata.org/ –

+0

@harperkoo我知道熊猫,我怎么能用它呢?我想用'findall'将数据放在一个列表中,然后使用熊猫。问题是获取数据。 – TheDaJon

+0

我想你想要过滤所有标题并获取其余数据,对不对?尝试'''df [(df.TTL1!=“TTL1”)''' –

回答

1

你可以试试这个:

\s*(\w+)\s*\|\s*(\w+)\s*\|\s*(\w+)\s*\n([^\|]*)(?:\n|$) 

由于每个操作的评论,奇怪的线条可以包含|到这使得难以对标题和线之间进行区分,因此下面的溶液可以尝试:

^\s*(\w+)\s*\|\s*(\w+)\s*\|\s*(\w+)\n(.*?)(?=^\s*\w+\s*\n*\|\s*\n*\w+\s*\n*\|\s*\n*\w+\s*\n*)|^\s*(\w+)\s*\|\s*(\w+)\s*\|\s*(\w+)\n(.*)$ 

Updated Regex Explanation

Explanation

示例代码:

import re 

regex = r"\s*(\w+)\s*\|\s*(\w+)\s*\|\s*(\w+)\s*\n([^\|]*)(?:\n|$)" 

test_str = ("TTL1 | TTL2 | TTL3\n" 
    "some text in a line1\n" 
    "some text in a line2\n" 
    "some text in a line3\n" 
    "TTL1 | TTL2 | \n" 
    "TTL3\n" 
    "some text in a line1\n" 
    "some text in a line2\n" 
    "some text in a line3\n" 
    "some text in a line4\n" 
    "some text in a line5\n" 
    "TTL1 | TTL2 | TTL3\n" 
    "some text in a line1\n" 
    "some text in a line2\n" 
    "some text in a line3\n" 
    "some text in a line4") 

matches = re.finditer(regex, test_str, re.DOTALL) 

for matchNum, match in enumerate(matches): 
    print(match.group(1)) 
    print(match.group(2)) 
    print(match.group(3)) 
    print(match.group(4)) 

Run it here

样本输出:

TTL1 
TTL2 
TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
TTL1 
TTL2 
TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4 
some text in a line5 
TTL1 
TTL2 
TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4 
+0

这几乎是我想要的,尽管我的行可以包含'|'标志,并在正则表达式中,我们将其删除。我怎样才能包含'|'符号? – TheDaJon

+0

你的意思是组4可以包含|签名以及? –

+0

是的,它也可能包含它。它可以包含任何字符。 – TheDaJon

0

用下面的办法与re.findall()功能:

# lines.txt is a file containing the initial text from your question 
with open('lines.txt', 'r') as fh: 
    t = fh.read() 
    items = re.findall(r'([A-Z\d\s|]+)([^A-Z]+)', t) 

# 'h' contains header, 'lines' contains the lines related to current header 
for h, lines in items: 
    print(h.replace('\n', ' '), lines, sep='\n') 

输出:

TTL1 | TTL2 | TTL3 
some text in a line1 
some text in a line2 
some text in a line3 

TTL1 | TTL2 | TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4 
some text in a line5 

TTL1 | TTL2 | TTL3 
some text in a line1 
some text in a line2 
some text in a line3 
some text in a line4