如何删除字符串中最后一个数字后的所有内容(某些字符除外)

时间:2016-09-22 14:52:26

标签: python regex

这是this question.

的后续行动

我学会了如何删除字符串中最后一个数字后的所有字符;所以我可以转

w = 'w123 o456 t789-- --'

w123 o456 t789

现在我可能有这样的字符串:

w = 'w123 o456 (t789)'

在这种情况下,

re.sub(r'\D+$', '', w)

会给我

w123 o456 (t789

所以我实际上有两个密切相关的问题:

1)如何以保留某些字符的方式修改命令re.sub(r'\D+$', '', w)(例如括号)?

2)如何修改命令re.sub(r'\D+$', '', w)以便只删除某些字符(例如破折号和空格)?

修改

@Martin Bonner的回答非常接近,例如为了

w='w123 -o456 t789--) --'

命令

 re.sub('[- ]+$', '', w)

给了我w123 -o456 t789--),但它也应该摆脱剩下的破折号。

4 个答案:

答案 0 :(得分:4)

要保留某些字符public class KafkaSink implements Serializable { private static KafkaProducer<String, String> producer = null; public KafkaProducer<String, String> getInstance(final Properties properties) { if(producer == null) { producer = new KafkaProducer<>(properties); } return producer; } public void close() { producer.close(); } } JavaSparkContext jsc = new JavaSparkContext(sc); Broadcast<KafkaSink> kafkaSinkBroadcast = jsc.broadcast(new KafkaSink())); dataset.toJavaRDD().foreach(row -> kafkaSinkBroadcast.getValue().getInstance(kafkaProducerProps()).send(new ProducerRecord<String, String>(topic, row.mkString(", ")))) ,请使用:

(

仅删除行尾的某些字符:

)

在方括号中,您可以列出要匹配的字符。如果第一个字符是re.sub('[^0-9()]+$', '', w) ,那么除了指定的字符之外的所有内容都会匹配。唯一的小问题是re.sub('[- ]+$', '', w) 通常指定一个范围(所以我们可以指定,例如,所有数字,而不必列出所有10个 他们)。这意味着如果我们要将^指定为要匹配的字符之一,则需要先 。 (如果要指定-,请使用-将其转义并返回原始字符串。)

从评论中,我认为你实际上意味着第二个挑战 “从字符串中删除位于最后一个数字和行尾之间的所有破折号和空格”。使用正则表达式可能是可能的,但是在三个月后回来维护代码的人会讨厌你(也可能是你)。记住Jamie Zawinski的话:

  

有些人在遇到问题时会想“我知道,我会用   正则表达式。“现在他们有两个问题。

答案 1 :(得分:1)

您可以在回调中使用另一个re.sub作为替换模式。

re.sub(r'\D+$', lambda m: re.sub(r'[^()]+','',m.group(0)), s)

在这里,您匹配字符串末尾除数字以外的所有符号,将该值传递给回调,并从该值中删除()以外的所有符号。

答案 2 :(得分:1)

如果总有3组字符,并且每组开头都有一个字母并且后面有3位数字,并且只有最后一组可能有括号,那么这个表达式可能正是您所需要的:

w = 'w123 o456 (t789)'
clean = re.sub(r'^.*(\w\d{3})[ -]+(\w\d{3})[ -]+(\(?\w\d{3}\)?).*$', r'\1 \2 \3', w)

clean现在打印'w123 o456 (t789)',即使字符串的开头或结尾还有其他字符。

此表达式适用于3组字符,每组字母由3个字母组成。对于最后一组,有可选括号 - \(?\)?。 3组之前和之后的所有字符都与^.*.*$匹配。然后我们只用3个捕获的组替换所有内容 - \1 \2 \3

答案 3 :(得分:1)

为什么不使用正则表达式,为什么不使用列表理解(如果你不想要某些字母或数字我们也可以改变它,这个自动保留字母和数字):

w = 'w123 o456 t789-- --'
list_to_keep =[' ']
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789 

w = 'w123 o456 (t789)'
list_to_keep =[' '] # add to me
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789 

,例如:

w = 'w123 o456 (t789)'
list_to_keep =[' ', '('] # add to me (I added '(' to keep for example)
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 (t789

它与你编辑过的马丁没有工作的东西有效:

w='w123 -o456 t789--) --'
list_to_keep =[' '] # add to me (I added '(' to keep for example)
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789