[英]RegEx to insert spaces between (Number-Number), (Number-char), (Char-Special char) and (special char- char) except '\'
我編寫了一個代碼來清理LaTex
(只是一個字符串),我想在 nnumbers 之間插入空格來標記字符串。 我的代碼如下:
def insert_spaces(sentence):
'''
Add a space around special characters, number and digits. So "2x+y -1/3x" becomes: "2 x + y - 1 / 3 x"
'''
dummy_list = []
splitted_sent = list(sentence)
for i in range(len(splitted_sent)-1):
dummy_list.append(splitted_sent[i])
if splitted_sent[i].isalpha(): # if it is an alphabet
if splitted_sent[i+1].isdigit() or (not splitted_sent[i+1].isalnum()):
dummy_list.append(' ')
elif splitted_sent[i].isdigit(): # if it is a number
if splitted_sent[i+1].isalpha() or (not splitted_sent[i+1].isalnum()):
dummy_list.append(' ')
elif (not splitted_sent[i].isalnum()) and (splitted_sent[i] not in [' ','\\']): # if it is a special char but not ' ' already
if splitted_sent[i+1].isalnum():
dummy_list.append(' ')
dummy_list.append(splitted_sent[-1])
return ''.join(dummy_list)
例如,如果我的原始查詢是:
'ds^{2} = (1 - {qcos\\theta\\over r})^{2\\over 1 + \\alpha^{2}}\\lbrace dr^2+r^2d\\theta^2+r^2sin^2\\theta d\\varphi^2\\rbrace -{dt^2\\over (1 - {qcos\\theta\\over r})^{2\\over 1 + \\alpha^{2}}}\\, .\\label{eq:sps1} \\widetilde\\gamma_{\\rm hopf}\\simeq\\sum_{n>0}\\widetilde{G}_n{(-a)^n\\over2^{2n-1}}\\label{H4}3455'
然后我希望它被清理為:
'd s ^ { 2 } = ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } \\lbrace d r ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 sin ^ 2 \\theta d \\varphi ^ 2 \\rbrace -{ d t ^ 2 \\over ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } } \\ , . \\label { eq : sps 1 } \\widetilde \\gamma _ { \\rm h o p f } \\simeq \\sum _ { n > 0 } \\widetilde { G } _ n { ( - a ) ^ n \\over 2 ^ { 2 n - 1 } } \\label { H 4 } 3 4 5 5'
上面的結果是這個腳本的產物,它基本上稱為這個KaTex
腳本
但現在,我得到的結果是:
'ds ^{ 2 } = ( 1 - { qcos \\theta \\over r })^{ 2 \\over 1 + \\alpha ^{ 2 }}\\lbrace dr ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 sin ^ 2 \\theta d \\varphi ^ 2 \\rbrace -{ dt ^ 2 \\over ( 1 - { qcos \\theta \\over r })^{ 2 \\over 1 + \\alpha ^{ 2 }}}\\, .\\label { eq : sps 1 } \\widetilde \\gamma _{\\rm hopf }\\simeq \\sum _{ n > 0 }\\widetilde { G }_ n {(- a )^ n \\over 2 ^{ 2 n - 1 }}\\label { H 4 } 3455'
有沒有辦法在 RegEx 的幫助下實現同樣的目標?
您在預期的 output 中有一些令人討厭的違規行為,例如
{eq:sps1}
你想 output 作為{ eq: sps 1 }
)sin
與所有其他詞相反(例如q c os
)應該作為sin
保留在一起,而不是轉換為sin
-{
在某些時候沒有轉換為- {
正如我所期望的那樣這些異常違反了我在測試期間能夠提出的任何正則表達式。 但這與您要實現的目標非常接近,也許您會發現它作為起點很有用...
更新:根據評論更改預期結果,已修復
sin
-> sin
-{
-> - {
除了空格,這個正則表達式應該處理你的例子。 請注意,由於您的描述,例如eq:...
是正則表達式的一部分,可以按照您的要求將eq
和sqs
保持在一起。
import re
text = r'ds^{2} = (1 - {qcos\\theta\\over r})^{2\\over 1 + \\alpha^{2}}\\lbrace dr^2+r^2d\\theta^2+r^2sin^2\\theta d\\varphi^2\\rbrace -{dt^2\\over (1 - {qcos\\theta\\over r})^{2\\over 1 + \\alpha^{2}}}\\, .\\label{eq:sps1} \\widetilde\\gamma_{\\rm hopf}\\simeq\\sum_{n>0}\\widetilde{G}_n{(-a)^n\\over2^{2n-1}}\\label{H4}3455'
# updated version according to comments, fixed in expected result:
# * "sin" -> "s i n"
# * "-{" -> "- {"
#expected = r'd s ^ { 2 } = ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } \\lbrace d r ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 sin ^ 2 \\theta d \\varphi ^ 2 \\rbrace -{ d t ^ 2 \\over ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } } \\ , . \\label { eq : sps 1 } \\widetilde \\gamma _ { \\rm h o p f } \\simeq \\sum _ { n > 0 } \\widetilde { G } _ n { ( - a ) ^ n \\over 2 ^ { 2 n - 1 } } \\label { H 4 } 3 4 5 5'
expected = r'd s ^ { 2 } = ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } \\lbrace d r ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 s i n ^ 2 \\theta d \\varphi ^ 2 \\rbrace - { d t ^ 2 \\over ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } } \\ , . \\label { eq : sps 1 } \\widetilde \\gamma _ { \\rm h o p f } \\simeq \\sum _ { n > 0 } \\widetilde { G } _ n { ( - a ) ^ n \\over 2 ^ { 2 n - 1 } } \\label { H 4 } 3 4 5 5'
res = re.sub(r"(?<!\s)(\s*(?:\\\\[a-zA-Z]*)|eq(?=:)|(?<=:)[a-zA-Z]+|(?:[^\s]))", r' \1', text).strip()
print(re.sub(r'\s+', r' ', res))
print(re.sub(r'\s+', r' ', expected))
output:
d s ^ { 2 } = ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } \\lbrace d r ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 s i n ^ 2 \\theta d \\varphi ^ 2 \\rbrace - { d t ^ 2 \\over ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } } \\ , . \\label { eq : sps 1 } \\widetilde \\gamma _ { \\rm h o p f } \\simeq \\sum _ { n > 0 } \\widetilde { G } _ n { ( - a ) ^ n \\over 2 ^ { 2 n - 1 } } \\label { H 4 } 3 4 5 5
d s ^ { 2 } = ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } \\lbrace d r ^ 2 + r ^ 2 d \\theta ^ 2 + r ^ 2 s i n ^ 2 \\theta d \\varphi ^ 2 \\rbrace - { d t ^ 2 \\over ( 1 - { q c o s \\theta \\over r } ) ^ { 2 \\over 1 + \\alpha ^ { 2 } } } \\ , . \\label { eq : sps 1 } \\widetilde \\gamma _ { \\rm h o p f } \\simeq \\sum _ { n > 0 } \\widetilde { G } _ n { ( - a ) ^ n \\over 2 ^ { 2 n - 1 } } \\label { H 4 } 3 4 5 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.