2014-10-06 70 views
1

我有這樣如何用python替換並移動字符串模式?

re.sub(r"""\s*(\p{LD}+)\s+NEAR/(\d)\s+(\p{LD}+)\s*""",r""""$1 $3"~$2""",'foo NEAR/4 bar') 

Python中的片段。

預期輸出是
「富巴」 〜4

,但現在我得到

foo NEAR/4 bar 

我試圖到Scala代碼轉換爲蟒蛇。 Scala代碼是

val near_rex = """\s*(\p{LD}+)\s+NEAR/(\d)\s+(\p{LD}+)\s*""".r; 
val out = near_rex.replaceAllIn("foo NEAR/4 bar", """"$1 $3"~$2"""); 

階段工作正常這裏http://www.simplyscala.com/

回答

1

我不知道斯卡拉,所以我不知道是什麼\p{LD}+應該匹配,但使用\w匹配[a-zA-Z0-9_](富/酒吧),正則表達式是確定的:

>>> re.sub(r"""\s*(\w+)\s+NEAR/(\d)\s+(\w+)\s*""",r""""\1 \3"~\2""",'foo NEAR/4 bar') 
'"foo bar"~4' 

爲了回報捕獲的羣體,你必須使用\1\2 ...而不是$1


正如意見建議的阿維納什拉吉,你可以得到通過簡單的人擺脫三元報價:

re.sub(r'\s*(\w+)\s+NEAR/(\d)\s+(\w+)\s*',r'"\1 \3"~\2','foo NEAR/4 bar') 

此外\p{L}不是斯卡拉特定的(學分阿邁勒穆拉利),但用於匹配屬於"letter" category的unicode字符。

+2

爲什麼混淆引號?只是're.sub(r'\ s *(\ w +)\ s + NEAR /(\ d)\ s +(\ w +)\ s *',r'「\ 1 \ 3」〜\ 2','foo NEAR/4 bar')'會很好。 – 2014-10-06 10:42:56

+1

'\ p {LD} +'不是Scala特有的東西。請參閱http://www.regular-expressions.info/unicode.html(在「* Unicode類別*」下)。 – 2014-10-06 11:39:59