Python正则表达式用于分隔以括号中的数字结尾的字符串

时间:2016-11-14 12:34:20

标签: python regex split strip

我有一个在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']]

所以我的查询是

  1. 为什么只使用命令的第一行就能完成它的工作。为什么要创建最后一个元素。
  2. 通过单一且简单的正则表达式有没有更好的方法来实现这一目标?

4 个答案:

答案 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 demoimport 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']]