【问题标题】:How do I extract location names from a string with mixed commas and quotation marks? (using Regex or any other methods)如何从逗号和引号混合的字符串中提取位置名称? (使用正则表达式或任何其他方法)
【发布时间】:2022-08-14 04:28:51
【问题描述】:

我有一串位置

locations = \'Los Angeles California ,\"Heliopolis, Central, Cairo, Egypt\",Berlin Germany, Paris France,\" Cairo, Egypt \" , \"Dokki, Giza, Egypt \" , Singapore\'

请注意,位置名称以逗号分隔。但是对于中间有逗号的每个名称,它都用双引号引起来。还有要去除的前缀/后缀空格。

将名称提取到列表中后,结果应为:

[\'Los Angeles California\', \'Heliopolis, Central, Cairo, Egypt\', \'Berlin Germany\', \'Paris France\', \'Cairo, Egypt\', \'Dokki, Giza, Egypt\', \'Singapore\']

我已经尝试过了,它能够得到结果。但是我在嘲笑我的工作,因为它看起来很麻烦????

import re

locations = \'Los Angeles California ,\"Heliopolis, Central, Cairo, Egypt\",Berlin Germany, Paris France,\" Cairo, Egypt \" , \"Dokki, Giza, Egypt \" , Singapore\'
lis1 = [e.strip() for e in re.findall(\'\"(.*?)\"\', locations)]
temp = []
for strg in lis1:
    temp.extend([x.strip() for x in strg.split(\',\')])
lis2 = [e.strip() for e in locations.split(\',\')]
for strg in lis2:
    if strg.strip(\'\"\').strip() not in temp:
        lis1.append(strg)
print(lis1)

所以我正在与社区联系......是否有使用正则表达式或任何其他方法的更好解决方案?

  • 为了避免 X-Y 问题,您从哪里提取数据,以及使用什么代码?
  • 我正在从这个post 学习正则表达式。如果要混合数据,我正在挑战自己解决它

标签: python string list extract


【解决方案1】:
[l.strip() for l in locations.split(",")]

【讨论】:

  • 请更新您的位置变量
  • 好的,我已经更新了
  • 抱歉,输出应该是带有'Los Angeles California''Heliopolis, Central, Cairo, Egypt''Berlin Germany''Paris France''Cairo, Egypt''Dokki, Giza, Egypt''Singapore' 的列表
【解决方案2】:

试试这个(这不使用正则表达式)

locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, " Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'

in_string = False
out = ['']

for char in locations:
    if char == '"':
        in_string = not in_string
        continue
    if char == ',':
        if not in_string:
            out.append('')
            continue
    out[-1] += char

print([x.strip() for x in out])

输出:

['Los Angeles California', 'Heliopolis, Central, Cairo, Egypt', 'Berlin Germany', 'Cairo, Egypt', 'Dokki, Giza, Egypt', 'Singapore']

【讨论】:

    【解决方案3】:
    locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'
    locations = locations.strip(',')
    locations=locations.split('"')
    
    result=[]
    for i in locations:
        i = i.strip()
        i = i.rstrip(',')
        i = i.lstrip(',')
        if i=="":
            continue
        else:
            result.append(i)
    
    print([e.strip() for e in result])
    

    输出

    ['Los Angeles California',
     'Heliopolis, Central, Cairo, Egypt',
     'Berlin Germany, Paris France',
     'Cairo, Egypt',
     'Dokki, Giza, Egypt',
     'Singapore']
    

    【讨论】:

    • 没问题等一下。
    • 更新。请检查它。
    【解决方案4】:

    我已经尝试在 javascript 中解决这个问题。还有另一种可能的解决方案:

    Javascript:

    locations = 'Los Angeles California ,"Heliopolis, Cairo, Egypt",Berlin Germany, " Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'
    
    locations.match(/\"?([\w, ]+\"?)/gi).map(x => x = x.replace(/\"/gi,'').trim().replace(/(^\,|\,$)/g, '').replace(/\s+/g, ' ').trim()).filter(x => x)
    

    输出:

    [
      'Los Angeles California ',
      'Heliopolis, Cairo, Egypt', 
      'Berlin Germany', 
      'Cairo, Egypt', 
      'Dokki, Giza, Egypt', 
      'Singapore'
    ]
    

    在 Python 中:

    import re
    
    locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'
    x = re.findall("\"?([\w, ]+)\"?", locations)
    
    print ([e.strip().strip(',').strip() for e in x if len(e)>5])
    

    输出:

    [
      'Los Angeles California ',
      'Heliopolis, Cairo, Egypt', 
      'Berlin Germany', 
      'Cairo, Egypt', 
      'Dokki, Giza, Egypt', 
      'Singapore'
    ]
    

    【讨论】:

    • 您能解释一下\"? 在正则表达式中的作用吗?
    • 如果在开始或结束时有任何 \" 匹配,我将打破字符串
    • 哦,我认为“柏林德国,法国巴黎”没有分手
    • 是的,这是个问题。我会仔细看看的。使用正则表达式在一行中解决是一件棘手的事情。
    • 那么可能在@Gold79的答案中像这样的两行?
    【解决方案5】:

    这是解决它的另一种方法

    import re 
    
    locations = 'Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore'
    lis1 = [e.strip() for e in re.findall('"(.*?)"', locations)]
    templis = ''.join(re.split('".*?"', locations))
    lis2 = [e.strip() for e in templis.split(',') if len(e.strip()) > 0]
    
    print(lis1 + lis2)
    
    ['Heliopolis, Central, Cairo, Egypt',
     'Cairo, Egypt',
     'Dokki, Giza, Egypt',
     'Los Angeles California',
     'Berlin Germany',
     'Paris France',
     'Singapore']
    

    【讨论】:

      【解决方案6】:

      今天我重试了,最后,我做到了,并在一行中得到了答案。

      在 Javascript 中:

      locations = `Los Angeles California ,"Heliopolis, Central, Cairo, Egypt",Berlin Germany, Paris France," Cairo, Egypt " , "Dokki, Giza, Egypt " , Singapore, "Kolkata, India", Nepal, Bhutan`;
      
      locations.replace(/\"[\w\s, ]+\"/gi, x => x.replace(/,/g, '\\').replace(/\"/g, '').trim()).split(',').map(x => x.replace(/\\/g, ',').trim())
      

      输出:

      [
        "Los Angeles California", 
         "Heliopolis, Central, Cairo, Egypt", 
         "Berlin Germany", 
         "Paris France", 
         "Cairo, Egypt", 
         "Dokki, Giza, Egypt", 
         "Singapore", 
         "Kolkata, India", 
         "Nepal", 
         "Bhutan"
      ] 
      

      解释:

      • 找到\" (double inverted commas)之间的字符串组合。
        • 然后将所有commas (,) 替换为Backslash (\):我正在使用反斜杠,因为我们没有在该位置使用它。
        • 删除\" (double inverted commas)
      • 现在用comma (,) 分割字符串,用comma (,) 替换Backslash (\)

      我可以在 python 中编写它。

      str.replace(find_st, x => x.replace(find_st1, rep_st))
      

      因为我不知道如何在 Python 中用 this 表达上述表达式。基本上是内部功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2023-02-23
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        相关资源
        最近更新 更多