如果一个字符串是一个点(.)被双引号包围,那么它是有效的。单独的点或单个双引号无效。
# Valid str examples
str1 = 'Don "B." White'
str10 = 'Don "M.dom" White'
str2 = 'Don "B." White "H." Joe'
# In-valid str examples
str3 = 'Don "B. White'
str4 = 'Don "B." White "H Simpson'
str5 = 'Don B. White' # dot must have double quotes around it e.g. "B."
我可以使用
检查一个点是否被双引号包围re.search(r'(?!")\.(?!")', str)
但是有点努力构建 reg 来检测
str3
或 str4
中的单双
我尝试了不同的负前瞻变体
r'"(?!")'
(我知道这是错误的)或 [^"]
正则表达式,但似乎无法正常工作。有什么想法吗?
你可以使用这个正则表达式:
^(?:[^".\n]*"[^"\n.]*\.[^"\n]*")*[^".\n]*$
正则表达式演示:
^
:开始(?:
:启动非捕获组
[^".\n]*
:匹配 0 个或多个不是 "
和 .
且不是换行符"
:匹配一个"
[^"\n.]*
:匹配 0 个或多个不是 "
和 .
且不是换行符\.
:匹配一个.
[^"\n]*
:匹配 0 个或多个不是 "
且不是换行符"
:匹配一个"
)*
:结束非捕获组。重复此组 0 次或多次[^".\n]*
:匹配 0 个或多个不是 "
且不是换行符$
:结束你需要这样的东西:
re.match(r"""^(?P<string>[^\."\n\r]*(?:(?:"(?:(?!").)+")[^\."\n\r]*)+)$""", my_string)
可以看到工作中的例子:
https://regex101.com/r/xgUzEL/1
还要检查单元测试选项卡。
您可能不需要外部命名捕获组
(?P<string>)
,但如果您想在更大的子字符串的一部分中使用它,它可能会有所帮助。