可能重复:
How to check if text is “empty” (spaces, tabs, newlines) in 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 \ tsome text \ t \ n \ n”
代码
s.strip('\s')
返回带有空格,制表符和换行符的相同字符串(r'\ s'没有区别)。代码
s.strip()
返回“some text”。这个,即使没有字符串调用的条带被认为默认剥离空白字符,我认为这正是表达式'\ s'正在做的事情。为什么一个剥离空白而另一个没有?
感谢您的任何澄清。
答案 0 :(得分:2)
Python字符串函数不了解正则表达式,因此如果要使用它们,则必须使用re
模块。
但是,如果您只想查找字符串是否完全是空格,则可以使用str.isspace()
函数:
>>> 'hello'.isspace()
False
>>> ' \n\t '.isspace()
True
答案 1 :(得分:1)
这就是你要找的东西
if not line.isspace(): do something
此外,str.strip
不使用正则表达式。
答案 2 :(得分:1)
如果你真的只想知道该行是否只包含空白字符,那么正则表达式有点矫枉过正。你应该得到以下内容:
if text.strip():
#do stuff
基本上与:
相同if not text.strip() == "":
#do stuff
Python将每个非空字符串计算为True
。因此,如果text
仅包含空白字符,则text.strip()
等于""
,因此评估为False
。
答案 3 :(得分:0)
表达式'\S' in line
与任何其他string in line
测试的作用相同;它测试左边的字符串是否出现在右边的字符串中。它不隐式编译正则表达式并搜索匹配项。这是好事。如果你正在编写一个操作用户输入的正则表达式的程序,并且实际想要测试某个子表达式如\S
是否在输入表达式中,该怎么办?
同样,请阅读str.strip
的文档。它是否会将它的输入视为正则表达式并删除匹配的字符串?不。如果你想用正则表达式做一些事情,你必须实际告诉Python,不要指望它以某种方式猜测你这意味着一个正则表达式,而其他时候它只是一个普通的字符串。虽然您可能会认为搜索正则表达式与搜索字符串非常相似,但就语言实现而言,它们完全不同的操作。大多数str
方法在应用于正则表达式时甚至都没有意义。
因为re.match
对象在布尔上下文中是“truthy”(与大多数类实例一样),所以至少可以通过删除if
测试来缩短is not None
语句。剩下的部分是实际告诉Python你想要什么的必要条件。至于你的str.strip
情况(或者你想要做类似于字符串操作但使用正则表达式的其他情况),请查看re
模块中的函数;那里有许多便利功能,可以提供帮助。否则,自己实现re_split
功能应该很容易。