我遇到了一个问题,我希望这个问题很简单,但是我遇到了一个试图找出问题的问题。我试图从文件中每行的开头删除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”
我在这里缺少一些非常基本的东西吗?请赐教。谢谢。
答案 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)