你如何在 python 中做正则表达式

how do you do regex in python

我有这样的字符串:

data='WebSpherePMI_jvmRuntimeModule_ProcessCpuUsage'

我需要删除正则表达式中第一个下划线(包括)之前的所有内容。

我试过这个:

re.sub("(^.*\_),"", data)

但这会删除所有下划线之前的所有内容

ProcessCpuUsage

我需要它是:

jvmRuntimeModule_ProcessCpuUsag

试试这个正则表达式:

result = re.sub("^.*?_", "", text)

正则表达式 ^.*?_ 的作用:

  • ^ ..断言位置在字符串的开头。
  • .*? .. Match every character that is not a linebreak character between zero and unlimitted times as few times as possible.
  • - ..匹配字符_

re.sub("(^.*\_),"", data)

这使得。匹配行中的每个字符。一旦它到达末尾,并且不能再匹配任何“.”,它就会转到下一个标记。糟糕,那是下划线!因此,它回溯到_ProcessCpuUsage 之前,它可以匹配开头的下划线,然后完成匹配。

你应该问。乘数不那么贪婪。您也不需要捕获内容。删除 parens。反斜杠什么都不做。算了吧。领先的 line-start 锚点也什么都不做。放弃吧。

re.sub(".*?_,", data)

你可以使用 str.index:

>>> data = 'WebSpherePMI_jvmRuntimeModule_ProcessCpuUsage'
>>> data[data.index('_')+1:]
'jvmRuntimeModule_ProcessCpuUsage'

使用str.split

>>> data.split('_',1)[1]
'jvmRuntimeModule_ProcessCpuUsage'

使用str.find

>>> data[data.find('_')+1:]
'jvmRuntimeModule_ProcessCpuUsage'

看看字符串方法Here

您已成为贪心匹配的受害者。表达式匹配它可能匹配的最长序列。

我知道有一种方法可以关闭贪婪匹配,但我一直不记得。相反,当有一个我想停下来的角色时,我会使用一个技巧。我不是用 . 匹配每个字符,而是匹配每个字符,除了我想停止的字符。

re.sub("(^[^_]*\_", "", data)

尝试使用 split():

s = 'WebSpherePMI_jvmRuntimeModule_ProcessCpuUsage'
print(s.split('_',1)[1])

结果:

jvmRuntimeModule_ProcessCpuUsage

应该这样做:

import re
def get_last_part(d):
    m = re.match('[^_]*_(.*)', d)
    if m:
        return m.group(1)
    else:
        return None

print get_last_part('WebSpherePMI_jvmRuntimeModule_ProcessCpuUsage')

改用这个:

from string import find

data='WebSpherePMI_jvmRuntimeModule_ProcessCpuUsage'
result = data[find(data, "_")+1:]
print result