输入: ['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()
答案 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])
确保后面有一个小写字母,前面有一个大写字母。这个位置被一个空间所取代并进行理解。
答案 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']