Python 正则表达式不';t将字符串与括号和\t匹配
我正在使用这段代码使用正则表达式拆分字符串Python 正则表达式不';t将字符串与括号和\t匹配,python,regex,Python,Regex,我正在使用这段代码使用正则表达式拆分字符串 suffixes = "(adj\.|adv\.|pron\.|num\.|num\.-m|conj\.|part\.|aux\.|prep\.|n\.|v\.|m\.)" regex = f'^(\w+?)((?:{suffixes}) .*)$' result = re.sub(regex, "\1#\2", re.escape(word), re.UNICODE).split("#")
suffixes = "(adj\.|adv\.|pron\.|num\.|num\.-m|conj\.|part\.|aux\.|prep\.|n\.|v\.|m\.)"
regex = f'^(\w+?)((?:{suffixes}) .*)$'
result = re.sub(regex, "\1#\2", re.escape(word), re.UNICODE).split("#")
这段代码几乎适用于我所有的字符串,但我面临着这两个字符串的问题:'qiān\tnum。千分之一
和'jiánm。(用于衣服和其他物品)件'
。似乎模式不匹配,我想是因为特殊字符\t
和()
关于Unicode(str)模式的
\t
\w所述\t
我的预期结果
匹配Unicode单词字符;这包括大多数
可以是任何语言中单词的一部分,也可以是数字和
强调。如果使用了ASCII标志,则仅匹配[a-zA-Z0-9]
\t
不是可以作为word一部分的字符。所以你需要添加它。尝试使用([\t\w]+?)
替换(\w+?)
,我相信您的数据是通过某些API损坏的。轻松修复:如果您不希望传入字符串中出现和选项卡,请将所有选项卡替换为t
使用
重新导入
后缀=r“(?:adj\.adv\.pron\.num\.num\.-m | conj\.part\.aux\.prep\.n\.v\.m\)”
regex=fr'^(\w+?)((?:{后缀})。*)$'
对于['qiān\tnum.000','jiánm.(用于衣服和其他物品)片段']中的句子:
结果=重新搜索(正则表达式,句子.replace('\t','t'))
如果结果为:
打印(result.groups())
看
结果:
('qiānt', 'num. thousand')
('jiàn', 'm. (used for clothes among other items) piece')
为什么
re.escape(word)
?您还使用re.UNICODE
作为计数参数。使用flags=re.UNICODE
,或者简单地将其删除,这在Python 3中是多余的。此外,在replacement@WiktorStribiżew感谢您提醒我使用re.escape(word)
,我删除了转义,现在只删除了第一个字符串(使用\t
)不起作用你也可以把它缩短一点,也许可以匹配制表符([\w\t]+)((?:ad[jv]| pron | num(?-m)?conj | part | aux | prep |[nvm])。
你不必匹配字符(
和)
因为您将#
放在组1和组2之间,然后在#
上再次拆分结果,请检查。我想您不需要re.sub
,re.search
就可以了。现在还不太清楚为什么要在组1中包含一个选项卡(空白)。如果有更多的空格(除了常规空格以外,我都懂),那该怎么办?