33 lines
928 B
Python
33 lines
928 B
Python
import re
|
|
|
|
|
|
class Change:
|
|
"""
|
|
Instantiates a string representation of a sound change.
|
|
"""
|
|
|
|
def __init__(self, change):
|
|
self.parse(change)
|
|
|
|
def __repr__(self):
|
|
return f"{self.b}>{self.a}/{self.f}_{self.t}"
|
|
|
|
def parse(self, change):
|
|
if '/' in change:
|
|
_change, _env = change.split('/')
|
|
else:
|
|
_change = change
|
|
_env = '_'
|
|
self.b, self.a = _change.split('>')
|
|
self.f, self.t = _env.split('_')
|
|
|
|
if self.f.startswith("{") and self.f.endswith("}"):
|
|
self.f = self.f[1:-1].split(',')
|
|
self.f = f"[{''.join(self.f)}]"
|
|
if self.t.startswith("{") and self.t.endswith("}"):
|
|
self.t = self.t[1:-1].split(',')
|
|
self.t = f"[{''.join(self.t)}]"
|
|
|
|
def sub(self, string):
|
|
return re.sub(f"(?<={self.f}){self.b}(?={self.t})", f"{self.a}", f"#{string}#").strip('#')
|