【发布时间】:2017-06-11 06:31:59
【问题描述】:
我正在尝试使用 strsplit 和 perl 正则表达式在 R 中拆分字符串。该字符串由各种由句点或连字符分隔的字母数字标记组成,例如"WXYZ-AB-A4K7-01A-13B-J29Q-10"。我要拆分字符串:
- 连字符出现的地方。
- 句号出现的地方。
- 标记的第二个和第三个字符之间正好是 3 个字符长,由 2 个数字后跟 1 个大写字母组成,例如
"01A"产生["01", "A"](但"012A"、"B1A"、"0A1", 和"01A2"没有拆分)。
例如,"WXYZ-AB-A4K7-01A-13B-J29Q-10" 应该产生 ["WXYZ", "AB", "01", "A", "13", "B", "J29Q", "10"]。
我当前的正则表达式是((?<=[-.]\\d{2})(?=[A-Z][-.]))|[.-],它在this online regex tester 中完美运行。
此外,替代方案的两个部分 ((?<=[-.]\\d{2})(?=[A-Z][-.])) 和 [.-] 在单独使用时都用于按照 R 中的预期拆分字符串:
#correctly splits on periods and hyphens
strsplit("WXYZ-AB-A4K7-01A-13B-J29Q-10", "[.-]", perl=T)
[[1]]
[1] "WXYZ" "AB" "A4K7" "01A" "13B" "J29Q" "10"
#correctly splits tokens where a letter follows two digits
strsplit("WXYZ-AB-A4K7-01A-13B-J29Q-10", "((?<=[-.]\\d{2})(?=[A-Z][-.]))", perl=T)
[[1]]
[1] "WXYZ-AB-A4K7-01" "A-13" "B-J29Q-10"
但是当我尝试使用替代方法组合它们时,第二个正则表达式停止工作,并且字符串仅在句点和连字符上拆分:
#only second alternative is used
strsplit("WXYZ-AB-A4K7-01A-13B-J29Q-10", "((?<=[-.]\\d{2})(?=[A-Z][-.]))|[.-]", perl=T)
[[1]]
[1] "WXYZ" "AB" "A4K7" "01A" "13B" "J29Q" "10"
为什么会这样?是我的正则表达式有问题,还是strsplit 有问题?我怎样才能达到预期的行为?
期望的输出:
## [[1]]
## [1] "WXYZ" "AB" "A4K7" "01" "A" "13" "B" "J29Q" "10"
【问题讨论】:
-
为澄清起见,
2285C是否会拆分为2285和C?如果没有,我需要编辑我的答案。 -
@RichScriven 不,它不会,如果令牌完全匹配
\d\d[A-Z]并且长度为 3,则它们只能在数字字母边界处拆分。 -
@RichScriven,只是加入边界?
"[-.]|(?<=\\b[0-9]{2})(?=[A-Z]\\b)" -
我投了反对票,因为这篇文章不清楚你的目标是什么。这导致人们浪费时间帮助正确解决错误的问题。如果你说得清楚,我会改变这个投票。最简单的方法是显示所需的输出。通常显示所需的输出会使帖子更清晰 10 倍。
-
@ApproachingDarknessFish 现在做还为时不晚。这使您的帖子对搜索类似问题的其他人有用。
标签: r regex pcre regex-lookarounds strsplit