使用正则表达式Python提取双引号之外的单词
我有这样一句话:“int open(const char*”pathname“,int”flags) 我试图找到一个正则表达式来提取双引号之外的单词。示例:“路径名”和“标志”。我创建了一个正则表达式,但它只捕获单词“flags”,而不捕获单词“pathname”。以下是我所拥有的:使用正则表达式Python提取双引号之外的单词,python,regex,Python,Regex,我有这样一句话:“int open(const char*”pathname“,int”flags) 我试图找到一个正则表达式来提取双引号之外的单词。示例:“路径名”和“标志”。我创建了一个正则表达式,但它只捕获单词“flags”,而不捕获单词“pathname”。以下是我所拥有的: reg2 = r"""(\".*\" (.*) )+\);""" pattern2 = re.compile(reg2) inner = m.group(1) m2 = pattern2.search(i
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”标志)
谢谢你的帮助
编辑:只需进一步澄清。另一种可能的情况是:
“int打开(const char*”路径名、“int”标志、“mode\u t”模式)代码>
我想提取单词:“路径名”、“标志”和“模式” 这里有一种方法可以替换引号中的内容,然后拆分结果字符串。您可能需要进行更多的处理,因为正如前面提到的)代码>也在引号之外
import re
my_string = '"int open(const char *" pathname ", int " flags );'
re.sub('".*?"', '_', my_string).split('_')[1:]
## [' pathname ', ' flags );']
这是一个完美的例子:忘记所有不在捕获组1中的东西
".*?"|(\w+)
解释:我们从两个备选方案中选择
“?
使用引号作为锚点从头到尾匹配字符串,并使用
和*
量词匹配任何重复次数。?
将星号的行为更改为尽可能少地匹配()以使用默认贪婪匹配
(\w+)
括号定义了捕获一个或多个+
字母数字的捕获组:\w
本身是一个表示[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
我发现很难确定你到底想要什么,但我还是给你做了一个正则表达式。这就是你要找的吗?为什么不是)代码>是否包含在结果中?这不是内部引号。你总是有两个这样的小组吗?还是会有更多的比赛find@ScottHunter除了)以外的所有内容
@CalumYou可能还有更多matchesHi,谢谢你的帮助!但是我试着克制自己不去改变原来的字符串。@lilmadoy我听不懂。原始字符串未更改。Nvm,很抱歉造成混淆,我看到了反斜杠,并认为您正在更改原始字符串。您的代码工作正常!只是几个简单的问题:反斜杠是用来做什么的?另外,你能解释一下为什么正则表达式有效吗?我对这东西不熟悉。谢谢@Lilly yaa,原始字符串以一种奇怪的方式转义。反斜杠用于转义字符串中的特殊字符,例如,当字符串中同时使用两种类型的引号时。哦,我明白了。谢谢