4

次の文字列があります

"1206292WS_R0_ws.shp"

2番目の「_」と「.shp」の間を除くすべてを再サブしようとしています

この場合、出力は「ws」になります。

.shp を削除することはできましたが、「_」の前のすべてを削除する方法がわかりません。

epass = "1206292WS_R0_ws.shp"

regex = re.compile(r"(\.shp$)")

x = re.sub(regex, "", epass)

出力

1206292WS_R0_ws

望ましい出力:

ws
4

5 に答える 5

7

これには正規表現は本当に必要ありません

print epass.split("_")[-1].split(".")[0]


>>> timeit.timeit("epass.split(\"_\")[-1].split(\".\")[0]",setup="from __main__
import epass")
0.57268652953933608

>>> timeit.timeit("regex.findall(epass)",setup="from __main__ import epass,regex
0.59134766185007948

速度は両方とも非常に似ているようですが、分割すると少し速くなります

実際、断然最速の方法

print epass.rsplit("_",1)[-1].split(".")[0]

(私のシステムでは)長さ100kの文字列で3秒かかりますが、他の方法では35秒以上かかります

最後の _ ではなく 2 番目の _ を実際に意味する場合は、それを行うことができます

epass.split("_",2)[-1].split(".")  

ただし、2nd _ が正規表現である場所によっては、同じくらい高速または高速になる場合があります

于 2013-06-05T15:55:33.663 に答える
2

あなたが記述する正規表現は ^[^_]*_[^_]*_(.*)[.]shp$

>>> import re
>>> s="1206292WS_R0_ws.shp"
>>> regex=re.compile(r"^[^_]*_[^_]*_(.*)[.]shp$")
>>> x=re.sub(regex,r"\1",s)
>>> print x
ws

注:これはあなたが説明した正規表現であり、必ずしも実際の問題を解決するための最良の方法ではありません.

2 番目の「_」と「.shp」の間を除くすべて

正規表現:

^       # Start of the string
[^_]*   # Any string of characters not containing _
_       # Literal 
[^_]*   # Any string of characters not containing _
(       # Start capture group
.*      # Anything
)       # Close capture group
[.]shp  # Literal .shp
$       # End of string    
于 2013-06-05T15:56:07.233 に答える
0

おそらく_([^_]+)\.shp$仕事をするでしょうか?

于 2013-06-05T15:54:48.257 に答える