我有以下表格的数据:
"C def geh.#- ijk "<> ""^^xsd:date.
现在是上述字符串的最后一部分,即&#34; C def geh。# - ijk&#34;&lt;&gt; &#34;&#34; ^^ xsd:date - 即以引号开头和结尾的部分。我想保留开头和结尾的引号,并删除所有其他引号和&lt;&gt;等,除了#, - ,。,_,(,)之间。有人可以建议我该怎么做。我的预期输出应显示为:
"C def geh.#- ijk "^^xsd:date.
答案 0 :(得分:1)
假设总会有匹配:
import re
def cleanup(str):
return ''.join(re.match('(\"[^\"]+\").*?(\^\^xsd\:date\.)', str).groups())
>>> s = """"C def geh.#- ijk "<> ""^^xsd:date."""
>>> cleanup(s)
'"C def geh.#- ijk "^^xsd:date.'
更新如果字符串末尾的点可能出现或可能不出现,请使用此(我忘记了美元符号以标记结尾):
def cleanup(str):
return ''.join(re.match('(\"[^\"]+\").*?(\^\^xsd\:date\.?)$', str).groups())
>>> s = '"1980-"05"-26"^^xsd:date'
>>> cleanup(s)
'"1980-"^^xsd:date'
如果你想在没有匹配的情况下处理这种情况(例如返回空字符串),那么就可以这样做:
def cleanup(str):
try:
return ''.join(re.match('(\"[^\"]+\").*?(\^\^xsd\:date\.?)$', str).groups())
except AttributeError:
return ''
>>> cleanup("asdfadf")
''
从OP获得更多解释后更新(需要清除第一个和最后一个引号之间的内容并保持其余部分不变):
def cleanup(str):
left_index = s.find('\"')
right_index = s.rfind('\"')
if left_index==right_index:
return str
else:
cleaned = re.sub('[^0-9a-zA-Z\#\-\.\_\(\)]','',s[left_index+1:right_index])
return str[:left_index+1]+cleaned+str[right_index:]
>>> cleanup(s)
'"1980-05-26"^^xsd:date'