从Python迁移到C#
我正在学习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#呢?
2
- 是的,你可以这样做。
- .Net支持命名组。所以对于
(?<first>group)(?'second'group)
,返回的匹配对象可以通过名字来获取内容。你可以从这个对象中创建一个字典,或者直接使用这个匹配对象。
var match = Regex.Match("subject", "regex");
var matchedText = match.Groups("first")
你可以查看.Net中的命名组和.Net中的正则表达式支持。 - 我觉得写一个
Record Record.Parse(namedValueCollection)
是个不错的办法。 - 你写代码……你就会学习。我觉得反向学习有点让人困惑……从动态转向静态应该相对容易一些……只是你可能需要为一些常规任务,比如迭代、映射或选择等,写更多的代码。