在Python中使用re
,我想返回字符串中第一次出现下划线之前的所有字符。另外,我希望返回的字符串全部为大写,不带任何非字母数字字符。
例如:
AG.av08_binloop_v6 = AGAV08
TL.av1_binloopv2 = TLAV1
我很确定我知道如何使用string.upper()
以大写字母返回字符串,但我确信有几种方法可以有效地删除.
。任何帮助将不胜感激。我仍在缓慢但肯定地学习正则表达式。每个提示都会添加到我的笔记中以备将来使用。
为了进一步澄清,我上面的例子不是实际的字符串。实际的字符串看起来像:
AG.av08_binloop_v6
我希望的输出看起来像:
AGAV08
下一个例子也是一样的。字符串:
TL.av1_binloopv2
期望的输出:
TLAV1
再次感谢大家的帮助!
答案 0 :(得分:19)
即使没有re
:
text.split('_', 1)[0].replace('.', '').upper()
答案 1 :(得分:7)
试试这个:
re.sub("[^A-Z\d]", "", re.search("^[^_]*", str).group(0).upper())
答案 2 :(得分:3)
由于每个人都在提供他们最喜欢的实现,所以这里的我没有使用re
:
>>> for s in ('AG.av08_binloop_v6', 'TL.av1_binloopv2'):
... print ''.join(c for c in s.split('_',1)[0] if c.isalnum()).upper()
...
AGAV08
TLAV1
我将.upper()
放在生成器的外部,因此只调用一次。
答案 3 :(得分:2)
您不必使用re
。根据您的要求,简单的字符串操作就足够了:
tests = """
AG.av08_binloop_v6 = AGAV08
TL.av1_binloopv2 = TLAV1
"""
for t in tests.splitlines():
print t[:t.find('_')].replace('.', '').upper()
# Returns:
# AGAV08
# TLAV1
或者,如果您绝对必须使用re
:
import re
pat = r'([a-zA-Z0-9.]+)_.*'
pat_re = re.compile(pat)
for t in tests.splitlines():
print re.sub(r'\.', '', pat_re.findall(t)[0]).upper()
# Returns:
# AGAV08
# TLAV1
答案 4 :(得分:2)
他只是为了好玩,另一个在第一个下划线之前获取文本的选项是:
before_underscore, sep, after_underscore = str.partition('_')
所以一行中的所有内容都可以是:
re.sub("[^A-Z\d]", "", str.partition('_')[0].upper())
答案 5 :(得分:1)
导入重新
re.sub(“[^ A-Z \ d]”,“”,yourstr.split('_',1)[0] .upper())