1.(?!re)
正则表达式 (?! re)
是一个负向先行断言,表示匹配不在 re
子表达式后面的位置。换句话说,它匹配一个位置,该位置后面不跟随 re
。
例如,正则表达式 foo(?! bar)
匹配字符串 "foo" 后面不是 "bar" 的位置。这意味着它可以匹配 "foo123",但不能匹配 "foo bar"。
这个特性在正则表达式中很有用,可以用来排除某些特定的情况。
2.(?=re)
正则表达式中的 (?=re) 是一个正向前瞻断言,它用于匹配在某个位置后面紧跟着特定模式 re 的字符串。但是它并不会将匹配的字符串包含在最终的匹配结果中。
例如,正则表达式 \d+(?=%) 会匹配任意数字后面紧跟着百分号的字符串,但是它只会匹配数字部分,不会包含百分号。
在上述例子中,(?=%) 表示要匹配一个百分号,但是不将其包含在最终的匹配结果中。
3.(?imx)
正则表达式(?imx) 是一个用于设置正则表达式的标志的语法。在这个示例中,标志包括 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函数的开始部分代码,不能正确找到结束部分的代码,要找到函数的完整代码,还需要用程序定根据 { 和 } 的数量配对,就可以定位到函数的结束位置。