在第一个下划线之前返回所有字符

时间:2010-09-21 16:31:26

标签: python regex string

在Python中使用re,我想返回字符串中第一次出现下划线之前的所有字符。另外,我希望返回的字符串全部为大写,不带任何非字母数字字符。

例如:

AG.av08_binloop_v6 = AGAV08
TL.av1_binloopv2   = TLAV1

我很确定我知道如何使用string.upper()以大写字母返回字符串,但我确信有几种方法可以有效地删除.。任何帮助将不胜感激。我仍在缓慢但肯定地学习正则表达式。每个提示都会添加到我的笔记中以备将来使用。

为了进一步澄清,我上面的例子不是实际的字符串。实际的字符串看起来像:

AG.av08_binloop_v6

我希望的输出看起来像:

AGAV08

下一个例子也是一样的。字符串:

TL.av1_binloopv2

期望的输出:

TLAV1

再次感谢大家的帮助!

6 个答案:

答案 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())