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

oknwwptz  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(165)

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

# 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来检测str3str4中的单个double有点困难
我尝试了不同的负先行r'"(?!")'(我知道它是错误的)或[^"]正则表达式的变体,但似乎不能让它工作。有什么想法吗?

p4rjhz4m

p4rjhz4m1#

您可以使用以下正则表达式:

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

RegEx Demo

RegEx演示:

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

xmjla07d2#

你需要这样的东西:

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

你可以在工作中看到一些例子:
https://regex101.com/r/xgUzEL/1
同时检查单元测试选项卡。
您可能不需要外部命名的捕获组(?P<string>),但如果您想在更大的子字符串中使用它,它可能会有所帮助。

相关问题