Python和JavaScript中的类似物。 第二部分

我们将继续发表有关这两种语言之间异同一系列文章的翻译


今天,我们将讨论字典序列化,JSON,常规,错误和异常。


本系列的其他文章:


  1. 第一部分是类型转换,三元运算符,通过属性名称,字典,列表,字符串,字符串连接访问属性。
  2. 这篇文章
  3. 第三部分 :现代Python和JS:字符串模式(f字符串),列表解压缩,lambda函数,列表迭代,生成器,集合。
  4. 第四部分是函数参数,创建并使用类,继承,setter getter和类属性。

杰森


当使用许多API时,将对象序列化为JSON对象很方便,以便于传输和后续解析。


Python有一个标准的json模块:


import json json_data = json.dumps(dictionary, indent=4) dictionary = json.loads(json_data) 

在这里,我们以4个空格的缩进格式格式化JSON。


在JS中,有一个JSON对象,其中包含用于创建和解析JSON字符串的方法:


 json_data = JSON.stringify(dictionary, null, 4); dictionary = JSON.parse(json_data); 

用常规解析字符串


在上一篇文章中,我们将多行合并为一个。 但是如何将一个长字符串分成几个部分,特别是如果分隔符不是单个字符(如逗号),而是整个范围的不同选项时? 这就是正则表达式和split()方法的用武之地。


在Python中, split()方法引用正则表达式模式。 以下是将文本字符串拆分为标点句子的方法:


 import re #     "!?."         delimiter = re.compile(r'[!?\.]+\s*') text = "Hello!!! What's new? Follow me." sentences = delimiter.split(text) # sentences == ['Hello', "What's new", 'Follow me', ''] 

在JS中, split()方法引用字符串:


 //     "!?."         delimiter = /[!?\.]+\s*/; text = "Hello!!! What's new? Follow me."; sentences = text.split(delimiter) // sentences === ["Hello", "What's new", "Follow me", ""] 

按图案定期搜索


正则表达式通常用于验证表单中的数据。
例如,要验证输入的电子邮件地址的正确性,必须将其与正则表达式模式进行比较。


课程翻译的作者

与常规人员检查地址是一项艰巨的任务, 本文给出的方法要复杂一些


在Python中,它将如下所示:


 import re # name, "@", and domain pattern = re.compile(r'([\w.+\-]+)@([\w\-]+\.[\w\-.]+)') match = pattern.match('hi@example.com') # match.group(0) == 'hi@example.com' # match.group(1) == 'hi' # match.group(2) == 'example.com' 

如果文本的一部分与模板匹配,则使用group()方法将返回整个部分,您可以在其中选择模板中定义的各个组。


0-整个行(子)匹配,1-第一组,2-第二组,依此类推。


如果找不到匹配项,则将返回类型为None的对象。


在JS中,有一个字符串方法match()返回字符串的匹配部分或null


 // name, "@", and domain pattern = /([\w.+\-]+)@([\w\-]+\.[\w\-.]+)/; match = 'hi@example.com'.match(pattern); // match[0] === 'hi@example.com' // match[1] === 'hi' // match[2] === 'example.com' 

在JS中,匹配的对象看起来像一个数组。 索引为[0]的元素是匹配的整个(子)行,第一个元素为第一个组,第二个元素为第二个,依此类推。 -全部符合模板中定义的组。


有时,除了搜索外,还需要确定样本在文本中的位置。 可以使用search()方法完成。
在Python中,此方法引用正则表达式并返回匹配的对象。 此匹配对象具有start()方法,该方法返回主行中此子字符串出现的开始:


 text = 'Say hi at hi@example.com' first_match = pattern.search(text) if first_match: start = first_match.start() # start == 10 

JS方法具有字符串方法search()该方法返回子字符串开头的索引。 如果未找到匹配项,则为-1


 text = 'Say hi at hi@example.com'; first_match = text.search(pattern); if (first_match > -1) { start = first_match; // start === 10 } 

使用正则表达式替换为模式


通常,当您要清除数据或向文本中添加一些属性时,需要替换模板。 例如,我们可以一行一行,使所有遇到的电子邮件地址都链接:


Python为此提供了一个sub() regex模式方法:


 html = pattern.sub( r'<a href="mailto:\g<0>">\g<0></a>', 'Say hi at hi@example.com', ) # html == 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

JS开发人员可以使用replace()字符串方法:


 html = 'Say hi at hi@example.com'.replace( pattern, '<a href="mailto:$&">$&</a>', ); // html === 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

在Python中,匹配组可用\g<0>, \g<1>, \g<2>等。
在JS中,例如$&, $1, $2等。


也可以用功能代替匹配部分。 当替换源文本的换行或计数,收集或获取有关文本的其他信息时,此类功能很有用。 例如,当我在替换时使用函数调用时,可以编写HTML语法突出显示。


让我们更改“大写字母”中的所有电子邮件地址。


在Python中,replace函数获取匹配的对象。 我们使用group()方法对匹配的文本执行操作,并将其作为替换返回:


 text = pattern.sub( lambda match: match.group(0).upper(), 'Say hi at hi@example.com', ) # text == 'Say hi at HI@EXAMPLE.COM' 

在JS中,replace函数获取整个字符串匹配,第一次出现,第二次出现等。 我们执行必要的操作并返回修改后的行:


 text = 'Say hi at hi@example.com'.replace( pattern, function(match, p1, p2) { return match.toUpperCase(); } ); // text === 'Say hi at HI@EXAMPLE.COM' 

错误处理


与Python相比,基于前端浏览器的JavaScript通常不用于写入/读取文件或访问数据库。 因此,与Python中的try..except块相比, try..catch块在JS中很少见。


但是,无论如何,错误处理都可以在用户脚本中执行,可以从库函数中调用并在主代码中截取。


在下面的MyException示例中,我们将定义MyException ,在函数中MyException它,并在try..except..finally块中查看如何捕获和处理它:


 class MyException(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def proceed(): raise MyException('Error happened!') try: proceed() except MyException as err: print('Sorry! {}'.format(err)) finally: print('Finishing') 

以下JS代码执行相同的操作-我们定义MyException类,在函数中MyException它,在try..catch..finally块中对其进行拦截和处理:


 function MyException(message) { this.message = message; this.toString = function() { return this.message; } } function proceed() { throw new MyException('Error happened!'); } try { proceed(); } catch (err) { if (err instanceof MyException) { console.log('Sorry! ' + err); } } finally { console.log('Finishing'); } 

在两种语言中, MyException类都有一个message参数和一个取决于message值的字符串表示方法。


当然,仅在发生错误的情况下才应引发/引发异常。 并且如果您已在模块中识别出此错误。


结论


  • 从JSON序列化到/从JSON序列化非常简单-Python中有什么,JS中有什么。
  • 常规是两种语言中功能强大的文字处理工具。
  • 您可以使用功能进行替换。
  • 对于更复杂的情况,可以使用调用,拦截和错误处理。

正如上次所说,您可以逐行匹配此处提供的代码示例,以了解类似的数据结构和使用它们的方法:字符串,数组,字典,对对象的访问。


在下一部分中,我们将讨论文本模式,解压缩列表,lambda函数,不使用索引,生成器和集合的迭代。

Source: https://habr.com/ru/post/zh-CN417513/


All Articles