我想在列表中提取部分字符串,该列表中没有空格,后跟python中的数字。
# INPUT
text = ['bits', 'scrap 1.2', 'bits and pieces', 'junk 3.4.2']
# EXPECTED OUTPUT
output = ['bits', 'scrap', 'bits and pieces', 'junk']
我设法使用re.sub或re.split执行此操作:
output = [re.sub(" [0-9].*", "", t) for t in text]
# OR
output = [re.split(' \d',t)[0] for t in text]
当我尝试使用re.search和re.findall时,它会返回空列表或空结果。
[re.search('(.*) \d', t) for t in text]
#[None, <_sre.SRE_Match object; span=(0, 7), match='scrap 1'>, None, <_sre.SRE_Match object; span=(0, 6), match='junk 3'>]
[re.findall('(.*?) \d', t) for t in text]
#[[], ['scrap'], [], ['junk']]
任何人都可以帮我处理可以返回re.search和re.findall的预期输出的正则表达式吗?
答案 0 :(得分:4)
您只能使用
删除字符串末尾的数字和点子串import re
text = ['bits', 'scrap 1.2', 'bits and pieces', 'junk 3.4.2']
print([re.sub(r'\s+\d+(?:\.\d+)*$', '', x) for x in text])
# => output = ['bits', 'scrap', 'bits and pieces', 'junk']
请参阅Python demo
模式是
\s+
- 1+个空格(注意:如果这些数字可以&#34;粘合&#34;到其他一些文本,请用{{1}替换+
(一次或多次出现) }量词(零次或多次出现))*
- 一位或多位\d+
- 0或更多序列
(?:\.\d+)*
- 一个点\.
- 一位或多位\d+
- 字符串结束。请参阅regex demo。
要对$
执行相同操作,您可以使用
re.findall
请参阅this regex demo。
但是,由于# To get 'abc 5.6 def' (not 'abc') from 'abc 5.6 def 6.8.9'
re.findall(r'^(.*?)(?: \d[\d.]*)?$', x) #
# To get 'abc' (not 'abc 5.6 def') from 'abc 5.6 def 6.8.9'
re.findall(r'^(.*?)(?: \d.*)?$', x) #
构造,此正则表达式效率不高。这里,
.*?
- 字符串开头^
- 第1组:除了换行符之外的任何零个或多个字符(使用(.*?)
以匹配所有字符)尽可能少(以便可以在每个位置测试下一个可选组) )re.DOTALL
- 可选的非捕获组匹配
(?: \d[\d.]*)?
- 空格
- 数字\d
- 零个或多个数字或[\d.]*
字符.
- 除了换行符之外的任何0 +字符,尽可能多.*
- 字符串结束。