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

3j86kqsm  于 2022-12-27  发布在  Python
关注(0)|答案(6)|浏览(186)

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

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

w8rqjzmb

w8rqjzmb1#

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

您还可以使用re.search,具体取决于您希望它如何匹配。
您可以运行此示例:

"""
very nice interface to try regexes: https://regex101.com/
"""
# %%
"""Simple if statement with a regex"""
import re

regex = r"\s*Proof.\s*"
contents = ['Proof.\n', '\nProof.\n']
for content in contents:
    assert re.match(regex, content), f'Failed on {content=} with {regex=}'
    if re.match(regex, content):
        print(content)
uemypmqf

uemypmqf2#

一个月

简单的if-regex示例:

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()而不是re.match。字符串的匹配方法restricts to the start,一个confusing约定。如果需要,请使用插入符号显式搜索:re.search(r'^...', ...)(或在多线路模式下使用\A
  • 对第一个参数使用raw string语法r'pattern'。否则,您需要将反斜杠加两个,如re.search('ing\\b', ...)
  • 在这些例子中,'\\b'r'\b'是一个特殊的序列,表示word-boundary,用于正则表达式。不要与'\b''\x08' backspace混淆。
  • 如果re.search()没有找到任何内容,则返回None,始终为falsy
  • 如果re.search()找到任何内容,则返回Match对象,这始终是真实的。
  • 一个组是匹配模式括号内的内容。
  • 组编号从1开始。
  • Specs
  • Tutorial
f0ofjuux

f0ofjuux3#

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

$ python
>>> import re
>>> help(re.compile(r''))

命令行中显示了以下内容:

search(string[, pos[, endpos]])--〉match对象或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一样不区分大小写,但它是独立的。

vecaoik1

vecaoik14#

首先编译正则表达式,然后必须将其与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
tf7tbtn2

tf7tbtn25#

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

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

irtuqstp6#

下面是一个运行示例:

"""
very nive interface to try regexes: https://regex101.com/
"""
# %%
"""Simple if statement with a regex"""
import re

regex = r"\s*Proof.\s*"
contents = ['Proof.\n', '\nProof.\n']
for content in contents:
    assert re.match(regex, content), f'Failed on {content=} with {regex=}'
    if re.match(regex, content):
        print(content)

相关问题