我有一个在beautifulsoup操作后生成的列表。它在括号中用数字分隔的字符串,我想将其拆分为内部列表。例如,我有
L1=['alpha(1) beta(4)','delta(5) gamma(6)']
这需要转换为
[[‘alpha’, ‘beta’],[‘gamma’, ‘delta’]]
我从这个
开始[re.split(r'\(\d\)',item) for item in L1]
但是这会在最后一项中创建额外的空间,然后在最后生成一个空白项目。
[['alpha', ' beta', ''], ['delta', ' gamma', '']]
所以我在代码中再添加一行
L1=[re.split(r'\(\d\)',item) for item in L1]
[[x.strip() for x in y if x] for y in L1]
这给了我想要的东西
[['alpha', 'beta'], ['delta', 'gamma']]
所以我的查询是
答案 0 :(得分:3)
我会使用split:
print([[j.split("(")[0] for j in i.split()] for i in L1])
返回:
[['alpha', 'beta'], ['delta', 'gamma']]
答案 1 :(得分:2)
从文档中,re.split()
的行为与str.split()
完全相同,str.split()
的文档明确说明
使用指定的分隔符拆分空字符串会返回['']。
由于分隔符右侧有一个空字符串,因此您的split()
结果中会出现一个空字符串。我认为为emtpy字符串返回''
会导致更一致和可预测的行为。
关于更好的实现代码的方法,我认为以下内容更清楚:
>>> L1=['alpha(1) beta(4)','delta(5) gamma(6)']
>>> name_list = []
>>> for s in L1:
name_list.append(re.findall(r'(\w+)\(\d+\)', s))
>>> name_list
[['alpha', 'beta'], ['delta', 'gamma']]
或使用列表理解:
name_list = [re.findall(r'(\w+)\(\d+\)', s) for s in L1]
答案 2 :(得分:2)
long startTime = System.currentTimeMillis();
ValueAnimator animator = new ValueAnimator();
animator.setObjectValues(0, 1000);
animator.setDuration(1000);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
long currentTime = System.currentTimeMillis();
String text = TimeFormatUtils.formatTime(startTime - currentTime);
yourTextView.setText(text);
}
@Override
public void onAnimationRepeat(Animator animation) {
long currentTime = System.currentTimeMillis();
String text = TimeFormatUtils.formatTime(startTime - currentTime);
yourTextView.setText(text);
}
});
animator.start();
模式在字符串中找到多个不重叠的匹配项,并在这些位置拆分字符串。这意味着它会将\(\d\)
拆分为'alpha(1) beta(4)'
,alpha
以及一个空字符串,因为上一个 beta
位于(4)
和字符串结尾之间。
如果您想使用原始 beta
方法的正则表达式,您可以考虑使用re.split
删除结果列表中的空项:
filter
请参阅Python demo。 import re
L1=['alpha(1) beta(4)','delta(5) gamma(6)']
res = [filter(None, re.split(r'\(\d+\)\s*', item)) for item in L1]
print(res)
# => [['alpha', 'beta'], ['delta', 'gamma']]
将匹配括号内的数字,\(\d+\)\s*
将匹配0 +空格。
答案 3 :(得分:1)
在逗号上拆分,然后使用正则表达式替换括号和数字。最后在空格上分割字符串。
import re
>>> [re.sub('\(\d\)', '', y).split() for x in L1 for y in x.split(',')]
[['alpha', 'beta'], ['delta', 'gamma']]