68

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

这是有效的代码,在我尝试使用 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

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

4

5 回答 5

131
if re.match(regex, content):
  blah..

您也可以re.search根据您希望它的匹配方式使用。

于 2013-01-08T23:11:31.743 回答
39

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

简单的 if 正则表达式示例:

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

复杂的 if-regex 示例(模式检查,提取子字符串,不区分大小写):

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()不重新匹配。匹配限制在字符串的开头,如果你问我,这是一个令人困惑的约定。如果您确实想要字符串开头的匹配,请使用插入符号,或者\Are.search(r'^...', ...)

  • 对第一个参数使用原始字符串语法r'pattern'。否则你需要加倍反斜杠,如re.search('ing\\b', ...)

  • 在这些示例中,'\\b'orr'\b'是用于正则表达式目的的特殊序列,表示词边界'\b'不要与退格或退格混淆'\x08'

  • re.search()None如果它没有找到任何东西,则返回,这总是falsy

  • re.search()如果找到任何东西,则返回一个Match 对象,这始终是真实的。

  • 一组是括号内匹配的内容

  • 组编号从 1 开始

  • 眼镜

  • 教程

于 2017-07-13T19:48:23.460 回答
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但自包含。

于 2013-01-08T23:09:23.417 回答
2

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

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
于 2013-01-08T23:08:16.100 回答
1

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

if 'facebook.com' in content.lower():
    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")
于 2013-01-08T23:19:28.730 回答