0

可能重复:
如何在 Python 中检查文本是否为“空”(空格、制表符、换行符)?

我正在尝试编写一个简短的函数来处理文件中的文本行。当它遇到具有重要内容的行(意味着不仅仅是空格)时,它就是对该行做一些事情。我想要的控制结构是

if '\S' in line: do something

或者

if r'\S' in line: do something

(我也用双引号尝试了相同的组合,是的,我已经导入了 re。)if上面的语句,在我尝试的所有形式中,总是返回 False。最后,我不得不求助于测试

if re.search('\S', line) is not None: do something

if这行得通,但与简单的陈述相比,感觉有点笨拙。那么,我的问题是,为什么该if声明不起作用,有没有办法(看似)优雅而简单地做一些事情?

我还有一个与控制结构无关的问题,但由于我怀疑它也与可能非法使用正则表达式有关,所以我会在这里问它。如果我有一个字符串

s = " \t\t 一些文本 \t \n\n"

编码

s.strip('\s')

返回包含空格、制表符和换行符的相同字符串(r'\s' 也不例外)。编码

s.strip()

返回“一些文本”。这一点,即使在没有字符串的情况下调用 strip 应该默认剥离空白字符,在我看来,这正是表达式 '\s' 正在做的事情。为什么一个剥离空白而另一个不剥离?

感谢您的任何澄清。

4

4 回答 4

2

Python 字符串函数不知道正则表达式,所以如果你想使用它们,你必须使用re模块。

但是,如果您只想找出字符串是否完全是空格,则可以使用以下str.isspace()函数:

>>> 'hello'.isspace()
False
>>> '  \n\t  '.isspace()
True
于 2012-05-22T21:24:53.647 回答
1

这就是你要找的

if not line.isspace(): do something

此外,str.strip不使用正则表达式。

于 2012-05-22T21:19:07.423 回答
1

如果您真的只是想知道该行是否仅包含空格字符,则正则表达式有点矫枉过正。你应该得到以下代替:

if text.strip():
    #do stuff

这基本上与以下内容相同:

if not text.strip() == "":
    #do stuff

Python 将每个非空字符串计算为True. 因此 iftext仅包含空格字符,text.strip()等于""并因此计算为False.

于 2012-05-22T21:21:38.053 回答
0

该表达式与任何其他测试'\S' in line执行相同的操作;string in line它测试左边的字符串是否出现在右边的字符串中。它不会式编译正则表达式并搜索匹配项。这是一件好事。如果您正在编写一个操作用户输入的正则表达式的程序,并且您实际上想测试\S输入表达式中是否有某些子表达式,该怎么办?

同样,请阅读str.strip. 它是否说会将其输入视为正则表达式并删除匹配的字符串?不。如果你想用正则表达式做一些事情,你必须实际告诉 Python,不要指望它会以某种方式猜测你这次指的是正则表达式,而其他时候它只是指普通字符串。虽然您可能认为搜索正则表达式与搜索字符串非常相似,但就语言实现而言,它们是完全不同的操作。大多数str方法在应用于正则表达式时甚至都没有意义。

因为re.match对象在布尔上下文中是“真实的”(就像大多数类实例一样),所以您至少可以通过删除测试来缩短您的if语句。is not None该行的其余部分对于实际告诉 Python 你想要什么是必要的。至于您的str.strip情况(或您想要执行类似于字符串操作但使用正则表达式的其他情况),请查看re模块中的函数;那里有许多有用的便利功能。否则re_split自己实现一个功能应该很容易。

于 2012-05-22T21:41:04.013 回答