正则表达式只检查一个双引号

问题描述 投票:0回答:2

如果一个字符串是一个点(.)被双引号包围,那么它是有效的。单独的点或单个双引号无效。

# 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'"(?!")'
(我知道这是错误的)或
[^"]
正则表达式,但似乎无法正常工作。有什么想法吗?

python regex regex-negation
2个回答
1
投票

你可以使用这个正则表达式:

^(?:[^".\n]*"[^"\n.]*\.[^"\n]*")*[^".\n]*$

正则表达式演示

正则表达式演示:

  • ^
    :开始
  • (?:
    :启动非捕获组
    • [^".\n]*
      :匹配 0 个或多个不是
      "
      .
      且不是换行符
    • 的字符
    • "
      :匹配一个
      "
    • [^"\n.]*
      :匹配 0 个或多个不是
      "
      .
      且不是换行符
    • 的字符
    • \.
      :匹配一个
      .
    • [^"\n]*
      :匹配 0 个或多个不是
      "
      且不是换行符
    • 的字符
    • "
      :匹配一个
      "
  • )*
    :结束非捕获组。重复此组 0 次或多次
  • [^".\n]*
    :匹配 0 个或多个不是
    "
    且不是换行符
  • 的字符
  • $
    :结束

0
投票

你需要这样的东西:

re.match(r"""^(?P<string>[^\."\n\r]*(?:(?:"(?:(?!").)+")[^\."\n\r]*)+)$""", my_string)

可以看到工作中的例子:

https://regex101.com/r/xgUzEL/1

还要检查单元测试选项卡。

您可能不需要外部命名捕获组

(?P<string>)
,但如果您想在更大的子字符串的一部分中使用它,它可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.