你如何在 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
我有这样的字符串:
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