regex - 当前面没有字符串时,正则表达式匹配字符
问题描述
我试图在标点符号之后匹配空格,以便拆分大量文本,但我看到一些常见的边缘情况,包括地点、标题和常见的缩写:
I am from New York, N.Y. and I would like to say hello! How are you today? I am well. I owe you $6. 00 because you bought me a No. 3 burger. -Sgt. Smith
我将它与re.split
Python 3 中的函数一起使用我想得到这个:
["I am from New York, N.Y. and I would like to say hello!",
"How are you today?",
"I am well.",
"I owe you $6. 00 because you bought me a No. 3 burger."
"-Sgt. Smith"]
这是目前我的正则表达式:
(?<=[\.\?\!])(?<=[^A-Z].)(?<=[^0-9].)(?<=[^N]..)(?<=[^o].)
我决定尝试修复第No.
一个,最后两个条件。但它依赖于匹配N
和o
独立,我认为这将在其他地方出现误报。我无法弄清楚如何让它只制作No
句号后面的字符串。Sgt.
然后,我将对遇到的任何其他“问题”字符串使用类似的方法。
我正在尝试使用类似的东西:
(?<=[\.\?\!])(?<=[^A-Z].)(?<=[^0-9].)^(?<=^No$)
但在那之后它没有捕获任何东西。我怎样才能让它排除我希望在其中有一个句点的某些字符串,而不是捕获它们?
这是我的情况的正则表达式:https ://regexr.com/4sgcb
解决方案
这是我能得到的最接近的正则表达式(尾随空格是我们匹配的那个):
(?<=(?<!(No|\.\w))[\.\?\!])(?! *\d+ *)
之后也将拆分Sgt.
,原因很简单,即在 Python 中后向断言必须是固定宽度(多么限制!)。
这就是我在 中的做法vim
,它没有这样的限制(尾随空格是我们匹配的空格):
\(\(No\|Sgt\|\.\w\)\@<![?.!]\)\( *\d\+ *\)\@!\zs
对于 OP 和普通读者来说,这个问题及其答案是关于环视的,非常有趣。
推荐阅读
- c - 在C中返回一个指针,在字符串中查找值
- r - R如何用来自不同级别数据集的匹配值替换数据集中的值
- javascript - 导出到excel数据表时换行
- c# - 具有 ApplicationUser 属性的实体,当我在服务中使用它时,该属性为空
- reactjs - Firestore 通过数组的字段值进行查询
- python - np.linalg.qr(A) 或 scipy.linalg.orth(A) 用于查找正交基 (python)
- haskell - 将变量传递给 IO 中的几个序列函数
- ios - 当我的应用程序通过我的 UITabBar 完成启动时,如何将加载的数据传递给 UITableView?
- javascript - OL-Cesium - 来自 services.arcgisonline.com 的源图
- aem - 自定义节点类型错误:javax.jcr.ItemExistsException:jcr:propertyDefinition