如何在组中获取表达式的单个部分?
How can I get a single part of the expression in a group?
我在LaTeX中有一个表达式,我想删除一些东西,我只想保留一部分,这是在一个组中指定的。
但是只删除前面的部分,而不是最后的部分。
我试着把它分成两组,第一组是我感兴趣的保留的,但即便如此,应该留在第二组的部分仍然留在第二组。
Python
>>> import re
>>> a='\n{\small{ Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}'
>>> patron=re.compile(r'\n\{*\small\{(?P<texto>.*)\}*', re.S)
>>> patron.findall(a)
[' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}']
我试过了:
>>> patron=re.compile(r'\n\{*\small\{(?P<texto>.*)(?P<llave>\}*)', re.S)
>>> patron.findall(a)
[(' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}', '')]
在这种情况下,我希望在元组的第二个元素中得到 '}}'。
我想得到:
[' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n ']
我的意思是,我想删除开头的 '\n{\small{' 和结尾的 '}}'
问题是你的选择组中的 .*
与末尾的两个 }
匹配,并且由于你在 }
之后有 *
,所以它是很高兴让他们在选择组内匹配并在 none 之后。
我有两个建议的解决方案,具体取决于您的全部要求:
您可以使用 `[^}]:
强制匹配组以 }
以外的字符结束
patron=re.compile(r'\n\{*\small\{(?P<texto>.*[^}])\}*', re.S)
如果您的字符串始终以 }
结尾,这将起作用,但如果它们后面有任何内容则不起作用。
如果你知道要保留的部分没有}
,使.*
非贪婪(使用.*?
)并要求1个或更多}
在最后而不是零个或多个,使用 \}+
:
patron=re.compile(r'\n\{*\small\{(?P<texto>.*?)\}+', re.S)
我在LaTeX中有一个表达式,我想删除一些东西,我只想保留一部分,这是在一个组中指定的。 但是只删除前面的部分,而不是最后的部分。
我试着把它分成两组,第一组是我感兴趣的保留的,但即便如此,应该留在第二组的部分仍然留在第二组。
Python
>>> import re
>>> a='\n{\small{ Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}'
>>> patron=re.compile(r'\n\{*\small\{(?P<texto>.*)\}*', re.S)
>>> patron.findall(a)
[' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}']
我试过了:
>>> patron=re.compile(r'\n\{*\small\{(?P<texto>.*)(?P<llave>\}*)', re.S)
>>> patron.findall(a)
[(' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n }}', '')]
在这种情况下,我希望在元组的第二个元素中得到 '}}'。
我想得到:
[' Sean $x,y∈R$ y evaluemos las potencias de $(x+y)$:\n\n$(x+y)^0=1=1\n(x+y)^1=(x+y)=x+y\n\n(x+y)^2=(x+y)·(x+y)=x^2+2xy+y^2\n\n(x+y)^3=(x+y)·(x+y)^2=x^3+3x^2y+3xy^2+y^3\n\n(x+y)^4=(x+y)·(x+y)^3=\nx^4+4x^3y+6x^2y^2+4xy^3+y^4\n\n(x+y)^5=(x+y)·(x+y)^4=\nx^5+5x^4y+10x^3y^2+10x^2y^3+5xy^4+y^5$\n ']
我的意思是,我想删除开头的 '\n{\small{' 和结尾的 '}}'
问题是你的选择组中的 .*
与末尾的两个 }
匹配,并且由于你在 }
之后有 *
,所以它是很高兴让他们在选择组内匹配并在 none 之后。
我有两个建议的解决方案,具体取决于您的全部要求:
您可以使用 `[^}]:
强制匹配组以}
以外的字符结束patron=re.compile(r'\n\{*\small\{(?P<texto>.*[^}])\}*', re.S)
如果您的字符串始终以
}
结尾,这将起作用,但如果它们后面有任何内容则不起作用。如果你知道要保留的部分没有
}
,使.*
非贪婪(使用.*?
)并要求1个或更多}
在最后而不是零个或多个,使用\}+
:patron=re.compile(r'\n\{*\small\{(?P<texto>.*?)\}+', re.S)