Python str.strip()与正则表达式过滤意外字符

时间:2016-04-08 20:27:52

标签: python regex

我遇到了一个问题,我希望这个问题很简单,但是我遇到了一个试图找出问题的问题。我试图从文件中每行的开头删除DateTime时间戳,但返回的信息正在切断我想保留的一些字符。我很确定我的正则表达式是正确的,并且基于regex.group()输出,它看起来不错。我发现带有字母“c”和“e”的行似乎会将其字符修剪掉,而其他行则按预期工作。

Python 2.7.6(默认,2015年6月22日,17:58:13)

在linux2上

[GCC 4.8.2]

>>> import re
>>>
>>> line2 = '[Wed Dec 01 10:24:24 2010] ceeeeest'
>>> a = re.match(r'(\[[A-Za-z]{3}\s)?([A-Za-z]{3})(\s+)([0-9]{1,4})(\s+)([0-9]{2})(:)([0-9]{2})(:)([0-9]{2})(\s[0-9]{1,4})?(\])?', line2, re.I)
>>> a.group()
'[Wed Dec 01 10:24:24 2010]'
>>> a.groups()
('[Wed ', 'Dec', ' ', '01', ' ', '10', ':', '24', ':', '24', ' 2010', ']')
>>> b = a.group()
>>> b
'[Wed Dec 01 10:24:24 2010]'
>>> c = line2.strip(b)
>>> c
'st'
>>>

我希望C成为“ceeeeest”

OR

>>> line = '[Wed Dec 01 10:24:24 2010] testc'
>>> a = re.match(r'(\[[A-Za-z]{3}\s)?([A-Za-z]{3})(\s+)([0-9]{1,4})(\s+)([0-9]{2})(:)([0-9]{2})(:)([0-9]{2})(\s[0-9]{1,4})?(\])?', line, re.I)
>>> a.group()
'[Wed Dec 01 10:24:24 2010]'
>>> a.groups()
('[Wed ', 'Dec', ' ', '01', ' ', '10', ':', '24', ':', '24', ' 2010', ']')
>>> b = a.group()
>>> c = line.strip(b)
>>> c
'test'
>>>

我希望c成为“testc”

我在这里缺少一些非常基本的东西吗?请赐教。谢谢。

6 个答案:

答案 0 :(得分:0)

方法str.strip将删除参数中字符串开头和结尾的所有字符。您可能希望改为使用str.replace

>>> line = '[Wed Dec 01 10:24:24 2010] testc'
>>> line.replace('[Wed Dec 01 10:24:24 2010]', '')
' testc'

您可以使用str.lstrip删除前导空格,或者如果您想要删除尾随空格(默认参数为空格),则可以使用str.strip

答案 1 :(得分:0)

b'[Wed Dec 01 10:24:24 2010]',因此您可以从c中删除b中的任何字符,以便删除所有条形ct

'[Wed Dec 01 10:24:24 2010] ceeeeest'
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
 # all in [Wed Dec 01 10:24:24 2010]

所以只留下st,因为它们是b中唯一的两个字符,strip会从两端继续剥离,直到它不在集合中的char:

In [3]: s = "fooboaroof"

In [4]: s.strip("foo")
Out[4]: 'boar'

如果日期总是在开始时,如果你正在使用匹配,那么当你得到一个匹配时,最简单的就是拆分:

line2 = '[Wed Dec 01 10:24:24 2010] ceeeeest'

print(line2.split("] ", 1)[1])

或者:

 print(line2[len(a.group()):].lstrip())

答案 2 :(得分:0)

正如其他人所指出的那样,您错误地使用了strip。相反,由于您已经进行了匹配工作,因此请从字符串的开头切掉字符数。

result = line[:len(a.group())]
print(result)
# prints ' testc'

答案 3 :(得分:0)

如果您的字符串中有重复项目具有相同的模式,则可以使用正则表达式查找所有匹配项,然后将其替换为空字符串

import re
pattern = r'\[\w{3} \w{3} \d{2} \d{2}:\d{2}:\d{2} \d{4}\] '
for p in re.findall(pattern,line):
   line = line.replace(p,'')

答案 4 :(得分:-1)

如果我得到你正在尝试做的事情,你可以使用正则表达式来提取单词/句子:

import re
regex = re.compile(r'(?:\s*\[.*?\])(.*)')
sentence = regex.findall(line)[0].strip()

请注意,我已经省略了你的正则表达式中的验证,你仍然可以使用它。

答案 5 :(得分:-1)

如果您真的想要strip(即丢弃)日期和时间信息,并且信息是您所代表的格式,请尝试以下操作:

#! python3

lines = [
    '[Wed Dec 01 10:24:24 2010] ceeeeest',
    '[Wed Dec 01 10:24:24 2010] testc',
    'just a plain old line',
    '       indented',
    '      with [brackets]',
    '[BOGUS! This should be disallowed!',
    '[][][] Three pairs',
]

for line in lines:
    if line.startswith('['):
        try:
            line = line[line.index(']')+2:]
        except ValueError:
            print('Invalid formatting: open [ with no close!')
        else:
            print(line)
    else:
        print('Ho hum, nothing interesting about:', line)