从Python迁移到C#

1 投票
6 回答
1328 浏览
提问于 2025-04-15 14:04

我正在学习C#,之前是用Python和PHP,现在想把一个Python脚本移植到C#上。

这个脚本是逐行读取一个文本文件(大约15万行),然后用一系列正则表达式去匹配,直到找到一个匹配的为止,接着获取命名组的结果,并把这些值作为一个类的属性。

数据的格式是这样的(每行以'No.'开头的是一个新记录的开始):

No.813177294  09/01/1987  150
Tit.INCAL INDÚSTRIA DE CALÇADOS LTDA (BR/PE)
*PARÁGRAFO ÚNICO DO ART. 162 DA LPI.
Procurador: ROBERTO C. FREIRE

No.901699870  02/06/2009  LD6
*Exigência Formal não respondida, Pedido de Registro de Marca considerado inexistente, de acordo com o Art. 157 da LPI

No.830009817  12/12/2008  003
Tit.BIOLAB SANUS FARMACÊUTICA LTDA. (BR/SP)
C.N.P.J./C.I.C./NºINPI : 49475833000106
Apres.: Nominativa ; Nat.: De Produto
Marca: ENXUG
NCL(9) 05 medicamentos para uso humano; preparações farmacêuticas; diuréticos, analgésicos;
anestésicos; anti-helmínticos; antibióticos; hormônios para uso medicinal.
Procurador: CRUZEIRO/NEWMARC PATENTES E MARCAS LTDA

正则表达式的样子是这样的:

regexp = {
    # No.123456789  13/12/2008  560
    # No.123456789   13/12/2008  560
    # No.123456789 13/12/2008 560
    # No.123456789  560
    'number': re.compile(r'No.(?P<Number>[\d]{9}) +((?P<Date>[\d]{2}/[\d]{2}/[\d]{4}) +)?(?P<Code>.*)'),

    # NCL(7) 25 no no no no no ; no no no no no no; *nonono no non o nono
    # NCL(9) 25 no no no no no ; no no no no no no; *nonono no non o nono
    'ncl': re.compile(r'NCL\([\d]{1}\) (?P<Ncl>[\d]{2})( (?P<Especification>.*))?'),

    'doc': re.compile(r'C.N.P.J./C.I.C./NºINPI : (?P<Document>.*)'),
    'description': re.compile(r'\*(?P<Description>.*)'),

    ...
}

现在我有几个问题:

1) 我可以用同样的方式,在每一行上应用一个Dictionary<string, Regex>,直到找到一个匹配的吗?

2) 如果可以的话,有办法得到一个Dictionary<string, string>,里面是命名组的结果吗?(在这个阶段我可以把所有东西都当作字符串处理)。

3) 假设我有一个这样的类……

class Record
{
    public string Number { get; set; }
    public string Date { get; set; }
    public string Code { get; set; }
    public string Ncl { get; set; }
    public string Especification { get; set; }
    public string Document { get; set; }
    public string Description { get; set; }
}

……有没有办法用命名组的值来设置这个类的属性?

4) 我是不是完全搞错了方向,试着在一个静态类型的语言里编程,却还在用动态类型的思维?如果是这样,我该怎么办?

抱歉问题有点长。我真的尽量简化了,让它更短一些:-)

提前谢谢你。

6 个回答

1

抱歉这不是一个具体的答案,但你能不能用IronPython把你的脚本转换成可以在CLR下运行的,然后再转到C#呢?

3

1. 好的

2. 比如说,可以看看这里

3. 是的,和第二点的基本概念是一样的

4. 不,C#足够灵活,可以让你把你的架构迁移过来

另外,建议你看看这本书,它是Python程序员了解.NET的最佳入门书籍,反过来也适用(我有点偏见,因为我曾是技术编辑,而且是作者的朋友,但我觉得这个推荐是有道理的;-)。

2
  1. 是的,你可以这样做。
  2. .Net支持命名组。所以对于(?<first>group)(?'second'group),返回的匹配对象可以通过名字来获取内容。你可以从这个对象中创建一个字典,或者直接使用这个匹配对象。
    var match = Regex.Match("subject", "regex");
    var matchedText = match.Groups("first")

    你可以查看.Net中的命名组.Net中的正则表达式支持
  3. 我觉得写一个Record Record.Parse(namedValueCollection)是个不错的办法。
  4. 你写代码……你就会学习。我觉得反向学习有点让人困惑……从动态转向静态应该相对容易一些……只是你可能需要为一些常规任务,比如迭代、映射或选择等,写更多的代码。

撰写回答