字符串替换从Pyt​​hon到F#的实用程序转换

时间:2011-05-26 19:55:08

标签: .net python f# utility

我有一个简单的python实用程序代码,可以逐行修改字符串。代码如下。

import re

res = ""
with open("tclscript.do","r") as f:
    lines = f.readlines()
    for l in lines:
        l = l.rstrip()
        l = l.replace("{","{{")
        l = l.replace("}","}}")
        l = re.sub(r'#(\d+)', r'{\1}',l)
        l += r'\n'
        res += l
    res = "code="+res

with open("tclscript.txt","w") as f:
    f.write(res)

使用F#实现的实用程序如何?可以在LOC中缩短并且比这个Python版本更容易阅读吗?

ADDED

python代码在C#字符串中处理tcl脚本。 C#字符串中的“{”/“}应更改为”{{“/”}}“,”#“后面的数字应修改为”{}“括起来的数字。例如,#1 - > {1}。

ADDED

这是工作示例

open System.IO
open System.Text.RegularExpressions

let lines = 
  File.ReadAllLines("tclscript.do")
  |> Seq.map (fun line ->
      let newLine = Regex.Replace(line.Replace("{", "{{").Replace("}", "}}"), @"#(\d+)", "{$1}") + @"\n"
      newLine )

let concatenatedLine = Seq.toArray lines |> String.concat ""
File.WriteAllText("tclscript.txt", concatenatedLine)

或者如This answer中所述。

open System.IO
open System.Text

let lines = 
  let re = System.Text.RegularExpressions.Regex(@"#(\d+)")
  [|for line in File.ReadAllLines("tclscript.do") ->
      re.Replace(line.Replace("{", "{{").Replace("}", "}}").Trim(), "$1", 1) + @"\n"|]

let concatenatedLine = lines |> String.concat ""
File.WriteAllText("tclscript.txt", concatenatedLine)

1 个答案:

答案 0 :(得分:4)

我不会给你一个F#版本的完整示例,因为我不确定Python版本中的正则表达式应该做什么。但是,一个不错的F#解决方案的一般结构看起来像这样:

let lines = 
  File.ReadAllLines("tclscript.do")
  |> Seq.map (fun line ->
      let newLine = line.Replace("{", "{{").Replace("}", "}}")
      // Implement additional string processing here
      newLine )

File.WriteAllLines("tclscript.txt", lines)

由于您的代码段是逐行工作的,因此我使用ReadAllLines将文件作为行列表读取,然后使用Seq.map将函数应用于每一行。可以使用WriteAllLines将新的行集合写入文件。

正如评论中所提到的,我认为你可以在Python中编写几乎相同的东西(即没有明确地连接字符串并使用一些高阶函数或理解语法来处理集合)。