我有這樣的文字:
Hans Wurst, geboren 25.01.1987, zuletzt t?tig als Metzger, Breslauer Str. 15, 02708 L?bau
我想從中獲得街道名稱(“Breslauer Str. 15”)。所以我使用了一個像下面這樣的正則運算式:
(?<=, )(. ?)(?=,[\s]?[0-9]{5})
但這是貪婪和匹配:
geboren 25.01.1987, zuletzt t?tig als Metzger, Breslauer Str. 15
我怎樣才能讓它不那么貪婪,以便基本上考慮到前瞻斷言(?=,[\s]?[0-9]{5}),它會考慮逗號的最新出現?
uj5u.com熱心網友回復:
只需[^,].*在 RegEx 模式的開頭添加即可。該模式[^,].*表示“非逗號”后跟任意字符任意次數。

PD:一點建議。如果您只能使用python(正則運算式是另一種語言)來解決這個問題,那就去做吧。對此的解決方法可能如下:
text = "Hans Wurst, geboren 25.01.1987, zuletzt t?tig als Metzger, Breslauer Str. 15, 02708 L?ba"
print(text.split(', ')[-2])
# 'Breslauer Str. 15'
這更pythonic,更容易理解,而且速度更快!
uj5u.com熱心網友回復:
在您的模式中,您可以更改(. ?)為[^,] . 點也可以匹配逗號,會匹配太多,在這種情況下否定字符類不能匹配逗號。
當您使用環視時,您可以省略捕獲組。
請參閱正則運算式演示以了解模式(?<=, )[^,] (?=,\s?[0-9]{5})
但是,由于您已經使用了捕獲組,因此您可以將環視更改為匹配,以使模式更加高效。
請注意,\s不必在字符類中。
, ([^,] ),[\s]?[0-9]{5}\b
模式匹配:
,字面匹配([^,] )捕獲組 1,匹配 1 個字符而不是,,\s?匹配逗號和可選的空白字符[0-9]{5}\b匹配 5 位數字和一個單詞邊界以防止部分匹配
查看正則運算式演示
import re
s="Hans Wurst, geboren 25.01.1987, zuletzt t?tig als Metzger, Breslauer Str. 15, 02708 L?bau"
pattern = r", ([^,] ),[\s]?[0-9]{5}\b"
m = re.search(pattern, s)
if m:
print (m.group(1))
輸出
Breslauer Str. 15
uj5u.com熱心網友回復:
我假設街道名稱:
- 在倒數第二個逗號之后的任何空格之后開始;
- 不包含逗號;和
- 緊跟在字串中的最后一個逗號之后。
在這種情況下,可以匹配正則運算式
[^, ][^,] (?=,(?!.*,))
演示
運算式的元素如下。
[^, ] # match a character that is neither a comma nor a space
[^,]* # match zero or more characters other than a comma
(?= # begin positive lookahead
, # match a comma
(?! # begin negative lookahead
.*, # match zero or more characters then a comma
) # end negative lookahead
) # end positive lookahead
您也可以將游標懸停在鏈接處運算式的每個元素上,以獲得對其功能的解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/354306.html
下一篇:一個單詞的Python正則運算式
