Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python str.strip()带有正则表达式,用于过滤意外字符_Python_Regex - Fatal编程技术网

Python str.strip()带有正则表达式,用于过滤意外字符

Python str.strip()带有正则表达式,用于过滤意外字符,python,regex,Python,Regex,我遇到了一个我希望很简单的问题,但是我遇到了一堵墙,试图找出它。我试图从文件中每一行的开头去掉DateTime时间戳,但是返回的信息删除了我想要保留的一些字符。我相当确定我的正则表达式是正确的,并且基于regex.group()输出,它看起来不错。我发现带有字母“c”和“e”的行似乎可以删除它们的字符,而其他行则可以正常工作 Python 2.7.6(默认值,2015年6月22日,17:58:13) [GCC 4.8.2]关于linux2 >>> import re >&

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

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

[GCC 4.8.2]关于linux2

>>> 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是“Ceeeest”

我希望c是“testc”

我在这里缺少一些基本的东西吗?请开导我。谢谢。

该方法将删除参数中字符串开头和结尾的所有字符。你可能想用它来代替


您可以通过使用或使用
str.strip来去除前导空格,如果您想去除尾随空格(默认参数为空格)。

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
中唯一的两个字符no,strip将从两端继续剥离,直到它碰到集合中不存在的字符:

In [3]: s = "fooboaroof"

In [4]: s.strip("foo")
Out[4]: 'boar'
如果日期始终在开始处,则在使用match时必须如此,当您获得匹配时,最简单的方法是拆分:

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

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


正如其他人指出的,您使用的
strip
不正确。相反,因为已经有匹配的工作,所以从字符串的开头切掉字符数

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

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

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,'')

如果我正确理解了您的意图,您可以使用正则表达式在之后提取单词/句子:

import re
regex = re.compile(r'(?:\s*\[.*?\])(.*)')
sentence = regex.findall(line)[0].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)

str.strip
没有做你认为它在做的事情。请重新阅读文档。c、e和空格都在b中,因此strip会将它们全部从其他行中删除,这些行有
[]
?没有其他行有[]。好的,我会重新阅读纸带文档。我现在看到它正在从.group()输出中包含的字符串的开头和结尾剥离任何单个字符/数字。是否有一个最好的方法来实现我试图通过“剥离”整个正则表达式匹配字符串来实现的目标?是否适合更改此问题的标题?我一直在寻找它,当我真的需要一个正则表达式条的帮助而不是一个标准的替换是的,这看起来不错。谢谢你,杰瑞德!我已经学习了str.strip()的内容,基本上,我有很多配置文件,在每一行要收集的文本前面可能有日期时间,也可能没有其他垃圾。我需要找到垃圾,把它剥掉,然后把剩下的储存起来。现在看来,这个方法最简单,也最容易理解。我还必须合并一个
str.lstrip()
方法。不用担心,你的日期行还有其他类似的行吗?
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,'')
import re
regex = re.compile(r'(?:\s*\[.*?\])(.*)')
sentence = regex.findall(line)[0].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)