【问题标题】:Python Regex to find a string in double quotes within a stringPython正则表达式在字符串中的双引号中查找字符串
【发布时间】:2012-03-20 03:44:11
【问题描述】:

我正在使用正则表达式在 python 中寻找可以执行类似操作的代码

输入:Regex should return "String 1" or "String 2" or "String3"

输出:String 1,String2,String3

我试过r'"*"'

【问题讨论】:

  • 引号内可能有引号,你会怎么处理?
  • 不,不会有任何引号。只是简单的字符串,包含 a-z、0-9 空格、下划线,主要是字母数字,其中没有任何单引号或双引号3
  • 这能回答你的问题吗? Extract string from between quotations

标签: python regex


【解决方案1】:

尝试从多行字符串中获取双引号字符串:

import re

s = """ 
"my name is daniel"  "mobile 8531111453733"[[[[[[--"i like pandas"
"location chennai"! -asfas"aadhaar du2mmy8969769##69869" 
@4343453 "pincode 642002""@mango,@apple,@berry" 
"""
print(re.findall(r'"(.*?)"', s))

【讨论】:

【解决方案2】:

这就是你需要做的所有事情:

def doit(text):      
  import re
  matches = re.findall(r'"(.+?)"',text)
  # matches is now ['String 1', 'String 2', 'String3']
  return ",".join(matches)

doit('Regex should return "String 1" or "String 2" or "String3" ')

结果:

'String 1,String 2,String3'

正如Li-aung Yip指出的那样:

详细地说,.+?.+ 的“非贪婪”版本。它使正则表达式匹配它可以匹配的最少字符数,而不是它可以匹配的最多字符数。贪心版,.+,会给String 1" or "String 2" or "String 3;非贪婪版本.+? 给出String 1String 2String 3

另外,如果要接受空字符串,请将@​​987654332@ 更改为.*。星号* 表示零个或多个,而加号+ 表示至少一个。

【讨论】:

  • 详细说明,.+?.+ 的“非贪婪”版本。它使正则表达式匹配它可以匹配的最少字符数,而不是它可以匹配的最多字符数。贪心版,.+,会给string 1" or "String 2" or "String 3;非贪婪版本.+? 给出String 1String 2String 3
  • 双引号是否需要转义?因为无论如何您都在使用原始字符串。 r'"(.+?)"' 不够吗?这似乎适用于我的系统。
  • @Sam 没必要。我继续删除它们:)
【解决方案3】:

来自https://stackoverflow.com/a/69891301/1531728

我的解决办法是:

import re
my_strings = ['SetVariables "a" "b" "c" ', 'd2efw   f "first" +&%#$%"second",vwrfhir, d2e   u"third" dwedew', '"uno"?>P>MNUIHUH~!@#$%^&*()_+=0trewq"due"        "tre"fef    fre f', '       "uno""dos"      "tres"', '"unu""doua""trei"', '      "um"                    "dois"           "tres"                  ']
my_substrings = []
for current_test_string in my_strings:
    for values in re.findall(r'\"(.+?)\"', current_test_string):
        my_substrings.append(values)
        #print("values are:",values,"=")
    print(" my_substrings are:",my_substrings,"=")
    my_substrings = []

要使用的替代正则表达式是:

  • re.findall('"(.+?)"', current_test_string) [Avinash2021] [user17405772021]
  • re.findall('"(.*?)"', current_test_string) [Shelvington2020]
  • re.findall(r'"(.*?)"', current_test_string) [Lundberg2012] [Avinash2021]
  • re.findall(r'"(.+?)"', current_test_string) [Lundberg2012] [Avinash2021]
  • re.findall(r'"["]', current_test_string) [Muthupandi2019]
  • re.findall(r'"([^"]*)"', current_test_string) [Pieters2014]
  • re.findall(r'"(?:(?:(?!(?
  • re.findall(r'"(.*?)(?
  • re.findall('"[^"]*"', current_test_string) # 导致双引号保留在字符串中,但可以通过其他方式删除。[Martelli2013]
  • re.findall('"([^"]*)"', current_test_string) [jspcal2014]
  • re.findall("'(.*?)'", current_test_string) [akhilmd2016]

current_test_string.split("\"") 方法适用于字符串具有其中子字符串嵌入引号内的模式。 这是因为它在本例中使用双引号作为分隔符来标记字符串,并接受未嵌入双引号内的子字符串作为从字符串中提取的有效子字符串。

参考资料:

【讨论】:

    【解决方案4】:

    高度赞成的答案没有考虑双引号字符串可能包含一个或多个双引号字符(当然,正确转义)的可能性。为了处理这种情况,正则表达式需要用 肯定的前瞻断言逐一累积字符,说明当前字符不是前面没有反斜杠的双引号字符(这需要否定的后向断言):

    "(?:(?:(?!(?<!\\)").)*)"
    

    See Regex Demo

    import re
    import ast
    
    
    def doit(text):
        matches=re.findall(r'"(?:(?:(?!(?<!\\)").)*)"',text)
        for match in matches:
            print(match, '=>', ast.literal_eval(match))
    
    
    doit('Regex should return "String 1" or "String 2" or "String3" and "\\"double quoted string\\"" ')
    

    打印:

    "String 1" => String 1
    "String 2" => String 2
    "String3" => String3
    "\"double quoted string\"" => "double quoted string"
    

    【讨论】:

      【解决方案5】:
      import re
      r=r"'(\\'|[^'])*(?!<\\)'|\"(\\\"|[^\"])*(?!<\\)\""
      
      texts=[r'"aerrrt"',
      r'"a\"e'+"'"+'rrt"',
      r'"a""""arrtt"""""',
      r'"aerrrt',
      r'"a\"errt'+"'",
      r"'aerrrt'",
      r"'a\'e"+'"'+"rrt'",
      r"'a''''arrtt'''''",
      r"'aerrrt",
      r"'a\'errt"+'"',
            "''",'""',""]
      
      for text in texts:
           print (text,"-->",re.fullmatch(r,text))
      

      结果:

      "aerrrt" --> <_sre.SRE_Match object; span=(0, 8), match='"aerrrt"'>
      "a\"e'rrt" --> <_sre.SRE_Match object; span=(0, 10), match='"a\\"e\'rrt"'>
      "a""""arrtt""""" --> None
      "aerrrt --> None
      "a\"errt' --> None
      'aerrrt' --> <_sre.SRE_Match object; span=(0, 8), match="'aerrrt'">
      'a\'e"rrt' --> <_sre.SRE_Match object; span=(0, 10), match='\'a\\\'e"rrt\''>
      'a''''arrtt''''' --> None
      'aerrrt --> None
      'a\'errt" --> None
      '' --> <_sre.SRE_Match object; span=(0, 2), match="''">
      "" --> <_sre.SRE_Match object; span=(0, 2), match='""'>
       --> None
      

      【讨论】:

      • 你能详细解释一下你的答案是如何工作的吗?根据提出的问题,我无法找到它。
      猜你喜欢
      • 2017-06-04
      • 2015-01-22
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多