Python:如何在if语句中使用RegEx?

时间:2013-01-08 23:06:12

标签: python regex

我有以下代码查看一个目录中的文件并将包含某个字符串的文件复制到另一个目录中,但我尝试使用正则表达式,因为字符串可以是大写和小写,也可以是两者的混合。

在我尝试使用RegEx的

之前,这是有效的代码
import os
import re
import shutil

def test():
    os.chdir("C:/Users/David/Desktop/Test/MyFiles")
    files = os.listdir(".")
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2")
    for x in (files):
        inputFile = open((x), "r")
        content = inputFile.read()
        inputFile.close()
        if ("Hello World" in content)
            shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")

当我尝试使用RegEx的

时,这是我的代码
import os
import re
import shutil

def test2():
    os.chdir("C:/Users/David/Desktop/Test/MyFiles")
    files = os.listdir(".")
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2")
    regex_txt = "facebook.com"
    for x in (files):
        inputFile = open((x), "r")
        content = inputFile.read()
        inputFile.close()
        regex = re.compile(regex_txt, re.IGNORECASE)

我猜我需要一行像

这样的代码
if regex = re.compile(regex_txt, re.IGNORECASE) == True

但我似乎无法得到任何工作,如果有人能指出我正确的方向,我们将不胜感激。

5 个答案:

答案 0 :(得分:76)

if re.match(regex, content) is not None:
  blah..

您也可以使用re.search,具体取决于您希望它匹配的方式。

答案 1 :(得分:10)

if re.search(r'pattern', string):

简单的if-test:

if re.search(r'ing\b', "seeking a great perhaps"):     # any words end with ing?
    print("yes")

模式检查,提取子字符串,不区分大小写:

match_object = re.search(r'^OUGHT (.*) BE$', "ought to be", flags=re.IGNORECASE)
if match_object:
    assert "to" == match_object.group(1)     # what's between ought and be?

注意:

  • 使用re.search()而不是re.match。如果您问我,请匹配restricts to the start字符串,confusing约定。如果您确实需要字符串开头匹配,请使用插入符号\A代替re.search(r'^...', ...)

  • 使用raw string语法r'pattern'作为第一个参数。否则你需要加倍反斜杠,如re.search('ing\\b', ...)

  • 在此示例中,\bspecial sequence,表示正则表达式中的word-boundary。不要与退格混淆。

  • re.search()如果找不到任何内容,则返回Nonere.search()

  • IBDesignable如果找到任何内容,则会返回falsy,这总是很简单。

  • 一个组是括号内的匹配

  • 组编号从1

  • 开始
  • Match object

  • Specs

答案 2 :(得分:7)

REPL使学习API变得容易。只需运行python,创建一个对象,然后询问help

$ python
>>> import re
>>> help(re.compile(r''))
命令行中的

显示了以下内容:

  

search(...)

     

search(string[, pos[, endpos]]) - >匹配对象或None。   扫描字符串查找匹配项,并返回相应的   MatchObject个实例。如果字符串中没有位置匹配,则返回None

所以你可以做到

regex = re.compile(regex_txt, re.IGNORECASE)

match = regex.search(content)  # From your file reading code.
if match is not None:
  # use match

顺便提及,

regex_txt = "facebook.com"

.匹配任何字符,因此re.compile("facebook.com").search("facebookkcom") is not None为真,因为.匹配任何字符。也许

regex_txt = r"(?i)facebook\.com"

\.匹配文字"."字符,而不是将.视为特殊的正则表达式运算符。

r"..."位表示正则表达式编译器在\.中获取转义,而不是解释它的python解析器。

(?i)使正则表达式不区分大小写,如re.IGNORECASE,但是自包含。

答案 3 :(得分:1)

不应该以这种方式真正使用正则表达式 - 除非你想要比你想做的更复杂的事情 - 例如,你可以将你的内容字符串和比较字符串规范化为:

if 'facebook.com' in content.lower():
    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")

答案 4 :(得分:0)

首先编译正则表达式,然后必须将其与matchfind或其他方法一起使用,以针对某些输入实际运行它。

import os
import re
import shutil

def test():
    os.chdir("C:/Users/David/Desktop/Test/MyFiles")
    files = os.listdir(".")
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2")
    pattern = re.compile(regex_txt, re.IGNORECASE)
    for x in (files):
        with open((x), 'r') as input_file:
            for line in input_file:
                if pattern.search(line):
                    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")
                    break