我有这句话:" int open(const char *" pathname",int" flags);
我试图找到一个正则表达式来提取双引号之外的单词。示例:"路径名"和#34;标志"。我创建了一个正则表达式,但它只捕获了" flags"而不是"路径名"。这就是我所拥有的:
reg2 = r"""(\".*\" (.*) )+\);"""
pattern2 = re.compile(reg2)
inner = m.group(1)
m2 = pattern2.search(inner)
EntityI = m2.group(2)
print EntityI
注意:m.group(1)是:" int open(const char *" pathname",int" flags);
感谢您的帮助!
编辑:只是澄清一些。另一种可能的情况可能是:
"int open(const char *" pathname ", int " flags ", mode_t " mode );
我想要提取单词:" pathname"," flags"," mode"。
答案 0 :(得分:2)
这是垃圾桶 - appraoch的完美案例:忘记捕获组1中没有的所有内容。
".*?"|(\w+)
解释:我们从两个替代方案中选择|
".?"
使用引号作为锚点以及使用.
和*
量词的任意数量的任意重复项之间的任何内容匹配从头到尾的字符串。 ?
使用默认贪婪匹配将星标的行为更改为尽可能少(lazy)与avoid to match too much匹配。(\w+)
括号定义了捕获一个或多个+
字母数字的捕获组:\w
本身是shorthand character class,代表[a-zA-Z0-9_]
(这是称为角色范围。)。示例代码:
import re
regex = r'".*?"|(\w+)'
test_str = "\"int open(const char *\" pathname \", int \" flags );"
matches = re.finditer(regex, test_str, re.MULTILINE)
for match in matches:
if match.group(1):
print ("Found at {start}-{end}: {group}".format(start = match.start(1), end = match.end(1), group = match.group(1)))
输出:
Found at 24-32: pathname
Found at 42-47: flags
答案 1 :(得分:0)
这是替换引号内部内容然后拆分结果字符串的一种方法。您可能希望进行更多处理,因为注意到);
也在引号之外。
import re
my_string = '"int open(const char *" pathname ", int " flags );'
re.sub('".*?"', '_', my_string).split('_')[1:]
## [' pathname ', ' flags );']