Python - 如何用大写字母拆分字符串数组?

时间:2017-10-23 07:55:16

标签: python regex string

输入: ['TotalAmt', 'ProgramServicesAmt', 'Desc']

预期输出['Total Amt', 'Program Services Amt', 'Desc']

我正在使用:

>>> import re
>>> data = ['TotalAmt', 'ProgramServicesAmt', 'Desc']
>>> re.findall('[A-Z][^A-Z]*', data)

编辑: 错误:

expected string or buffer

Request Method:     GET
Request URL:    http://localhost:8002/data?ein=132618801
Django Version:     1.11.5
Exception Type:     TypeError
Exception Value:    

expected string or buffer

编辑2:也可以使用此功能,但存在相同的错误

re.sub( r"([A-Z])", r" \1", ['TotalAmt', 'ProgramServicesAmt', 'Desc']).split()

4 个答案:

答案 0 :(得分:1)

您收到TypeError,因为您正试图在list上应用re.findall。您必须从string获取list并在re.findall中使用该>>> for s in l: print(re.findall('[A-Z][^A-Z]*',s)) => ['Total', 'Amt'] ['Program', 'Services', 'Amt'] ['Desc']

list comprehension

或单个班轮>>> [re.findall('[A-Z][^A-Z]*', s) for s in l] => [['Total', 'Amt'], ['Program', 'Services', 'Amt'], ['Desc']] #required format >>> [' '.join(re.findall('[A-Z][^A-Z]*', s)) for s in l] => ['Total Amt', 'Program Services Amt', 'Desc']

IN : l = ['TotalAmt', 'ProgramServicesAmt', 'Desc']

#driver values:

public void formatJSONArray(String results){
        try {
            JSONArray jsonArray = new JSONArray(results);
            for(int i = 0; i < jsonArray.length(); i++){
                JSONObject jsonObject=jsonArray.getJSONObject(i);
                if(jsonObject.optString("name") != null) {
                    //tvData.append(jsonObject.getString("name"));
                    repoNameList.add(jsonObject.getString("name"));

                    //Toast.makeText(getContext(), "1 " + repoNameList.get(1), Toast.LENGTH_SHORT).show();
                }

                if(jsonObject.optJSONObject("owner") != null){
                    JSONObject ownerObject=jsonObject.getJSONObject("owner");

                    if(ownerObject.optString("login")!=null) {
                        //tvData.append(ownerObject.getString("login"));
                        userNameList.add(ownerObject.getString("login"));
                        //ownerObject.append(ownerObject.getString("avatar_url"));
                    }
                }
            }
        adapter.notifiDatasetchange();

        }catch (JSONException jsonException){

        }
    }

答案 1 :(得分:1)

您可以使用外观和列表理解:

import re

strings = ['TotalAmt', 'ProgramServicesAmt', 'Desc']

rx = re.compile(r'(?<=[a-z])(?=[A-Z])')

nstrings = [rx.sub(' ', string) for string in strings]
print(nstrings)
# ['Total Amt', 'Program Services Amt', 'Desc']

在这里,表达式(?<=[a-z])(?=[A-Z])确保后面有一个小写字母,前面有一个大写字母。这个位置被一个空间所取代并进行理解。

请参阅a demo on regex101.com

答案 2 :(得分:1)

一件有趣的事情就是在大写字母之前插入一个空格。例如:

>>> re.sub('(?=[A-Z])', ' ', data[0])
' Total Amt'

但请注意,开头会插入一个空格。为此你可以剥去字符串......

>>> re.sub('(?=[A-Z])', ' ', data[0]).strip()
'Total Amt'

?=执行匹配的“非捕获版本”,因此这是可能的......

要将上述方案应用于所有数据,请像其他人一样使用列表理解......

>>> [re.sub('(?=[A-Z])', ' ', d).strip() for d in data]
['Total Amt', 'Program Services Amt', 'Desc']

这样做的好处是您不必检查返回值是否为None。当我们使用正则表达式时,这种检查有时会很烦人。

>>> re.sub('(?=[A-Z])', ' ', 'dljlksdjf').strip()
'dljlksdjf'

答案 3 :(得分:0)

试试这个

import re
data = ['TotalAmt', 'ProgramServicesAmt', 'Desc']
output=[]
for i in data:
    output.append(" ".join(re.findall('[A-Z][^A-Z]*', i)))

print output

输出

['Total Amt', 'Program Services Amt', 'Desc']