我学会了如何删除字符串中最后一个数字后的所有字符;所以我可以转
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--)
,但它也应该摆脱剩下的破折号。
答案 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