Python:控制结构中的正则表达式

时间:2012-05-22 21:16:36

标签: python regex

  

可能重复:
  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'正在做的事情。为什么一个剥离空白而另一个没有?

感谢您的任何澄清。

4 个答案:

答案 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功能应该很容易。