首先,你不需要知道阿拉伯語來回答這個問題,只要知道阿拉伯語是從右到左寫的,阿拉伯語中的數字是從左到右寫的。
我正在嘗試將英語專案翻譯成阿拉伯語并列印出來。例如:“紙卷 2.50mx 3.36m VIP”轉換成阿拉伯語是“VIP ??? ??? 2.50 ? × 3.36 ?”
我使用正則運算式來查看是否有任何未發現的單詞(英文單詞和數字)不將其反轉。
english = re.compile("^[A-Za-z0-9_.] $")
item_name = "paper roll 2.50m x 3.36m VIP"
''.join(s if english.match(s) else s[::-1] for s in reversed(re.split('(\w )', arabic_reshaper.reshape(GoogleTranslator(source='en', target='ar').translate(item_name)))))
這里的問題是正則運算式將單詞視為“50”、“.”。并且“2”代表“2.50”,然后將其設為“50.2”,因此輸出變為“VIP ??? ??? 50.2 ? × 36.3 ?”,這是不正確的。
有沒有可能我可以檢查這個詞是否是十進制數而不是使用正則運算式來反轉它?
uj5u.com熱心網友回復:
我沒有安裝谷歌翻譯,但你可以試試:
re.findall(r'(\d \.\d )|(\w )', item_name)而不是re.split您正在使用的。這將產生一個元組串列,如[('', 'paper'), ('', 'roll'), ('2.50', ''), ('', 'm'), ('', 'x'), ('3.36', ''), ('', 'm'), ('', 'VIP')]現在在您的條件運算式中使用該元組串列,例如:
[t[0] if t[0] else t[1] if english.match(t[1]) else t[1][::-1] for t in reversed(re.findall(r'(\d \.\d )|(\w )', item_name))]
附上您的評論:
在
×您的例子不匹配的\w是ASCII導向;×是一個擴展的 UNICODE 代碼點。您可以嘗試
\S哪個是與×.使用
' '.join(...)重建的空間。
鑒于:
raw_output='? 26.3 × ? 50.2 ??? ??? VIP'
嘗試:
' '.join([t[0] if t[0] else t[1] if english.match(t[1]) else t[1][::-1] for t in reversed(re.findall(r'(\d \.\d )|(\S )', raw_output))])
結果:
VIP ??? ??? 50.2 ? × 26.3 ?
uj5u.com熱心網友回復:
您可以使用re庫解決問題。
import re
text = 'VIP ??? ??? 50.2 ? × 36.3 ?'
# Matches all values that contain a number followed by a dot and then another number
reversed_numbers = re.findall('\d \.\d ', text)
for value in reversed_numbers:
# reverse the reversed values
tt = value[value.index('.') 1:] '.' value[:value.index('.')]
# replace reversed values
text = text.replace(value, tt)
# final result :)
print(text) # ==> VIP ??? ??? 2.50 ? × 3.36 ?
uj5u.com熱心網友回復:
我沒有嘗試過阿拉伯語翻譯部分,但你做得很好,所以我想解決方案不需要它。相反,我只是顛倒了字串的非數字部分。
話雖如此,這是否滿足您的需求?
matchStringNum = re.compile("[A-Za-z\s*] (?=[0-9])?|[\d\.]*")
item_name = "paper roll 2.50m x 3.36m VIP"
reversedString = ''
for string in matchStringNum.findall(item_name)[::-1]:
try:
float(string)
except ValueError:
reversedString = reversedString string[::-1]
else:
reversedString = reversedString string
print(reversedString)
輸出:
PIV m3.36 x m2.50 llor repap
uj5u.com熱心網友回復:
您可以構建一個迭代器,它回傳一個由子字串組成的 2 元組序列,并帶有一個布林值,表示它們是否為數字:
import re
def get_parts(s):
"""
Iterator which yields sequence of tuples
(is_number, substring)
"""
start = 0
for m in re.finditer(r'\d \.?\d*|\d*\.?\d ', s):
yield from _get_non_digit_parts(s[start:m.start()])
yield (True, m.group())
start = m.end()
yield from _get_non_digit_parts(s[start:])
def _get_non_digit_parts(s):
"""
helper function - splits up a part which is known not to contain
numbers
"""
for part in re.split(r'(\w )', s):
if part:
yield (False, part)
使用此示例呼叫代碼:
s = "paper roll 2.50m x 3.36m VIP"
for is_number, part in get_parts(s):
print(f'{is_number} "{part}"')
你會得到:
False "paper"
False " "
False "roll"
False " "
True "2.50"
False "m"
False " "
False "x"
False " "
True "3.36"
False "m"
False " "
False "VIP"
然后您可以以任何您想要的方式處理這些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377525.html
上一篇:JavascriptRegEx:/(\b\S \b)(?=.*\b\1\b)/在(-,/)存在時洗掉重復的單詞失敗
下一篇:搜索并替換為帶有修改的反向參考
