Python正则表达式非捕获问题?

0 投票
3 回答
503 浏览
提问于 2025-04-16 06:48

我想从一个字符串中提取所有被引号(" 或 ')包围的子字符串,但不包括引号本身。于是我想出了这个方法:

"((?:').*[^'](?:'))|((?:\").*[^\"](?:\"))"

但是不知为什么,匹配到的字符串里还是包含了引号。请问这是为什么呢?

真诚的,nikita.utiu。

3 个回答

0

你可以试试:

import shlex
...
lexer = shlex.shlex(your_input_string)

quoted = [piece.strip("'\"") for piece in lexer if piece.startswith("'") or piece.startswith('"')]

shlex(词法分析)会帮你处理转义的引号。不过要注意,它不支持unicode字符串。

0

使用非捕获组并不意味着它们完全不被捕获。它们只是不会像普通的捕获组那样创建单独的捕获组。

不过,正则表达式的结构要求引号是匹配的一部分:

"('[^']*'|\"[^\"]*\")"

然后在处理匹配的部分时,只需用 matched_string[1:-1] 去掉周围的引号就可以了。

1

你可以使用前瞻和后顾断言来实现这个功能:

>>> match = re.search(r"(?<=').*?(?=')", "a 'quoted' string. 'second' quote")
>>> print match.group(0)
quoted

撰写回答