Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串括在单引号内_Python_Regex - Fatal编程技术网

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中,然后匹配
    }
  • re.sub
    将匹配数据对象传递给lambda表达式
  • 第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中,然后匹配
    }
  • re.sub
    将匹配数据对象传递给lambda表达式
  • 第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()