Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式Python提取双引号之外的单词_Python_Regex - Fatal编程技术网

使用正则表达式Python提取双引号之外的单词

使用正则表达式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

我有这样一句话:“int open(const char*”pathname“,int”flags)

我试图找到一个正则表达式来提取双引号之外的单词。示例:“路径名”和“标志”。我创建了一个正则表达式,但它只捕获单词“flags”,而不捕获单词“pathname”。以下是我所拥有的:

 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,原始字符串以一种奇怪的方式转义。反斜杠用于转义字符串中的特殊字符,例如,当字符串中同时使用两种类型的引号时。哦,我明白了。谢谢