Python 将字符串括在单引号内
我试图用单引号将大括号Python 将字符串括在单引号内,python,regex,Python,Regex,我试图用单引号将大括号{}中的所有单个值括起来 例如: some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21} Above should convert as below: some test {'Value1','Value2'} more text {'Value3'} more text {'Value4', 'Value1', 'V
{}
中的所有单个值括起来
例如:
some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21}
Above should convert as below:
some test {'Value1','Value2'} more text {'Value3'} more text {'Value4', 'Value1', 'Value5', 'Value9', 'Value11', 'Value21'}
我能够找出模式,但不确定如何在文件中替换它们
源文件内容:
2321232~CD IN ('JSS12QQ','OQJS','QE9QAA','HAHSS31A','KAA43A','QA00A')~CD IN
(JSS12QQ','OQJS','ULOE9Q','HAHSS31A','KAA43A','QA00A','QM34AA','WS2A','JS3QQ')~US~
{QA00A,WS2A,JS3QQ,OQJS,KAA43A,ULOE9Q,QM34AA,HAHSS31A,JSS12QQ}~{KAA43A,QA00A,QM34AA,WS2A,JS3QQ}
~CD IN ('2AA2Q')~CD IN ('2AA2Q')~US~{2AA2Q}~{2AA2Q}~{QM34AA,JSS12QQ}
目标文件内容:
2321232~CD IN ('JSS12QQ','OQJS','QE9QAA','HAHSS31A','KAA43A','QA00A')~CD IN
(JSS12QQ','OQJS','ULOE9Q','HAHSS31A','KAA43A','QA00A','QM34AA','WS2A','JS3QQ')~US~
{'QA00A','WS2A','JS3QQ','OQJS','KAA43A','ULOE9Q','QM34AA','HAHSS31A','JSS12QQ'}~{'KAA43A','QA00A','QM34AA','WS2A','JS3QQ'}
~CD IN ('2AA2Q')~CD IN ('2AA2Q')~US~{'2AA2Q'}~{'2AA2Q'}~{'QM34AA,JSS12QQ'}
获取模式的代码:
import re
def parse(file_name):
file = open(file_name)
file_contents =file.read()
f = file_contents
rec=re.findall(r"{.*?}",f)
print (rec)
parse("rule_engine_temp.csv")
请帮助解释,以便我能理解和处理它的变化。您可以使用
import re
f="some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21}"
rec=re.sub(r"{([^{}]*)}", lambda x: "{{'{}'}}".format("', '".join(re.split(r'\s*,\s*', x.group(1)))) ,f)
print(rec)
# => some test {'Value1', 'Value2'} more text {'Value3'} more text {'Value4', 'Value1', 'Value5', 'Value9', 'Value11', 'Value21'}
见
注:
-匹配{([^{}]*)}
,然后将{
和{
以外的0+字符捕获到组1中,然后匹配}
}
将匹配数据对象传递给lambda表达式re.sub
- 第1组值用
-一个用可选空格括起来的逗号拆分(如果间距一致,可以使用字符串拆分操作,例如\s*,\s*
),然后用x.Group(1)。拆分(',')
连接',
import re
f="some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21}"
rec=re.sub(r"{([^{}]*)}", lambda x: "{{'{}'}}".format("', '".join(re.split(r'\s*,\s*', x.group(1)))) ,f)
print(rec)
# => some test {'Value1', 'Value2'} more text {'Value3'} more text {'Value4', 'Value1', 'Value5', 'Value9', 'Value11', 'Value21'}
见
注:
-匹配{([^{}]*)}
,然后将{
和{
以外的0+字符捕获到组1中,然后匹配}
}
将匹配数据对象传递给lambda表达式re.sub
- 第1组值用
-一个用可选空格括起来的逗号拆分(如果间距一致,可以使用字符串拆分操作,例如\s*,\s*
),然后用x.Group(1)。拆分(',')
连接',
- 我的尝试
s = """some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21}"""
import re
def my_sub(g):
return '{' + re.sub(r'([a-zA-Z\d]+[a-z\d]+)(,|$)', r"'\1'\2", g[1]) + '}'
s = re.sub(r'{([^{}]+)}', my_sub, s)
print(s)
r'{([^{}]+)}'
与大括号()
然后sub调用函数my\u sub
,我们将在其中向值()添加逗号。my trument
s = """some test {Value1,Value2} more text {Value3} more text {Value4, Value1, Value5, Value9, Value11, Value21}"""
import re
def my_sub(g):
return '{' + re.sub(r'([a-zA-Z\d]+[a-z\d]+)(,|$)', r"'\1'\2", g[1]) + '}'
s = re.sub(r'{([^{}]+)}', my_sub, s)
print(s)
r'{([^{}]+)}'
与大括号()
然后sub调用函数
my_sub
,我们将在其中为值()添加逗号。您能解释一下为什么建议在这里使用(?(id/name)yes pattern | no pattern)
<代码>({)是必须的,因此组1将始终匹配,?(1)
将始终返回TRUE。顺便说一句,如果您将(?:,|$)
转换为捕获组,您可以使用r“'\1'\2”
替换,并且不需要rstrip(',)
。您也可以在这里使用更有效的前瞻,(?=,|$)
或者更好的一个,(?![^,])
,并使用r“\1”
替换。如果你想混淆正则表达式:),这里有另一个想法:@WiktorStribiżew是的,你是对的,它非常模糊;)我快速阅读了re模块文档,认为这是匹配大括号的方法,但很简单{[^{}+}
就足够了。还在学习re
@WiktorStribiżew我编辑了我的答案。谢谢你建议删除rstrip()
!你能解释一下为什么建议在这里使用(?(id/name)yes模式| no模式)
吗?({
是必须的,所以第一组总是匹配的,?(1)
将始终返回TRUE。顺便说一句,如果您将(?:,|$)
转换为捕获组,您可以使用r“'\1'\2”
替换,并且不需要rstrip(',)
。您也可以在这里使用更有效的前瞻,(?=,|$)
,甚至更好的,(?![^,])
,并使用r'\1''
replacement。如果你想混淆一个正则表达式:),这里有另一个想法:@WiktorStribiżew是的,你是对的,它非常模糊;)我很快阅读了re模块文档,认为这是匹配大括号的方法,但很简单{([^{}]+}
就足够了。仍在学习re
@WiktorStribiżew我编辑了我的答案。感谢您建议删除rstrip()
!