正则表达式使用

1.(?!re)

正则表达式 (?! re) 是一个负向先行断言,表示匹配不在 re 子表达式后面的位置。换句话说,它匹配一个位置,该位置后面不跟随 re

例如,正则表达式 foo(?! bar) 匹配字符串 "foo" 后面不是 "bar" 的位置。这意味着它可以匹配 "foo123",但不能匹配 "foo bar"。

这个特性在正则表达式中很有用,可以用来排除某些特定的情况。

2.(?=re)

正则表达式中的 (?=re) 是一个正向前瞻断言,它用于匹配在某个位置后面紧跟着特定模式 re 的字符串。但是它并不会将匹配的字符串包含在最终的匹配结果中。

例如,正则表达式 \d+(?=%) 会匹配任意数字后面紧跟着百分号的字符串,但是它只会匹配数字部分,不会包含百分号。

在上述例子中,(?=%) 表示要匹配一个百分号,但是不将其包含在最终的匹配结果中。

3.(?imx)

正则表达式(?imx) 是一个用于设置正则表达式的标志的语法。在这个示例中,标志包括 i、m 和 x。

  • i:表示不区分大小写,即在匹配时忽略大小写。
  • m:表示多行模式,即将字符串视为多行,并且 ^ 和 $ 匹配每一行的开始和结束。
  • x:表示扩展模式,即忽略正则表达式中的空白字符和注释,使其更易于阅读和理解。

使用这些标志可以改变正则表达式的匹配行为,使其更加灵活和适应不同的需求。

4.(?<=...)

正则表达式中的 (?<=...) 是一个正向后顾约束,用于匹配某个位置之前的内容。具体来说,(?<=...) 表示要匹配的内容必须跟在 ... 的后面。

例如,假设有一个字符串 "Hello World",我们想要匹配位于 "World" 前面的 "Hello",可以使用正则表达式 (?<=Hello) World。这里的 (?<=Hello) 表示要匹配的内容必须跟在 "Hello" 的后面,而后面的 " World" 表示要匹配的内容是 " World"。

需要注意的是,(?<=...) 只是一个约束条件,不会包含在最终的匹配结果中。在上述例子中,实际匹配到的内容是 " World",而不包括 "Hello"。

这是一个非常有用的功能,可以在某些情况下提取或匹配特定位置之前的内容。

5.使用正则表达式查找c语言的函数体

学习了上面的正则表达式规则,我们使用正则表达式来解决一些复杂的问题。

我想从c代码中找到所有函数

def parse_c_code(filename):
    # 读取C代码文件
    with open(filename, 'r', encoding='utf-8') as file:
        code = file.read()

    # 使用正则表达式提取函数体
    function_regex = r'\b(?!(if|for|switch|while))\([\w\s\*,]*\)\s*\{([\w\W]*?)(?=\})'
    functions = re.findall(function_regex, code)

    # 打印所有函数体
    for i, function in enumerate(functions):
        print(f"Function {i+1}:\n{function}\n")

if __name__ == "__main__":

        parse_c_code('mycode.c')

以上代码可以找到c函数的开始部分代码,不能正确找到结束部分的代码,要找到函数的完整代码,还需要用程序定根据 { 和 } 的数量配对,就可以定位到函数的结束位置。

你可能感兴趣的:(正则表达式,python)